`

socket编程(二)--服务器端实现多线程处理客户端请求

阅读更多

需求:与socket编程(一)相同的需求

客户端代码如下:

package com.socket.clientsocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Sclient {

	/**
	 * @param args
	 */
	
	protected BufferedReader socketReader;
	protected PrintWriter socketWriter;
	protected String hostIp;
	protected int hostPort;
	
	
	public Sclient(String ahostIp,int ahostPort){
		this.hostIp = ahostIp;
		this.hostPort = ahostPort;
		
	}
	public void setUpConnection(){
	
		try {
			//1.创建Socket,建立连接
			Socket socket = new Socket(hostIp,hostPort);
			//2.获取输入流和输出流,并进行封装
			socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			socketWriter = new PrintWriter(socket.getOutputStream());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void tearDownConnection(){
		
		try {
			socketReader.close();
			socketWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}
	//根据需求,对流进行处理
	public String getFile(String fileNameToGet){
		StringBuffer sb = new StringBuffer();
		socketWriter.println(fileNameToGet);
		socketWriter.flush();
		String line = null;
		try {
			while((line = socketReader.readLine()) != null){
				sb = sb.append(line + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sb.toString();
	}
	public static void main(String[] args) {
		//创建客户端
		Sclient client = new Sclient("198.27.0.166",8200);
		//建立连接
		client.setUpConnection();
		//需求操作
		String content = client.getFile("c:\\log.txt");
		//关闭连接
		client.tearDownConnection();
	}

}

 服务器端代码如下:

package com.socket.multiserversocket;

import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

public class SserverM {

	/**
	 * @param args
	 */
	
	protected int listenPort = 3000;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		SserverM server = new SserverM();
		
		server.acceptConnections();

	}
	
	//将处理丢给一个实现Runnable接口类的新线程
	public void handleConnection(Socket connectionToHandle) {
	     new Thread(new ConnectionHander(connectionToHandle)).start();
	}


	
	public void acceptConnections() {
        try {
        	//5为最多等待客户端数目,连上正在处理的请求,总共能处理6个,如果再有请求,将拒绝连接
        ServerSocket server = new ServerSocket(listenPort, 5);
        Socket incomingConnection = null;
        while (true) {
            incomingConnection = server.accept();
            handleConnection(incomingConnection);
        }
    } catch (BindException e) {
    System.out.println("Unable to bind to port " + listenPort);
    } catch (IOException e) {
    System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
    }
}


}

 实现Runnable接口的处理器

package com.socket.multiserversocket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ConnectionHander implements Runnable {
	
	protected Socket incommingSocket;
	
	public ConnectionHander(Socket aIncommingSocket){
		this.incommingSocket = aIncommingSocket;
	}

	public void run() {
		
		try {
			InputStream inputFromSocket = this.incommingSocket.getInputStream();
			OutputStream outputToSocket = this.incommingSocket.getOutputStream();
			
			BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket));
			FileReader fileReader = new FileReader(new File(streamReader.readLine()));
			
			
			BufferedReader bufferedFileReader = new BufferedReader(fileReader);
			
			PrintWriter socketWriter = new PrintWriter(outputToSocket);
			String line = null;
			while((line = bufferedFileReader.readLine()) != null){
				socketWriter.println(line);
			}
			
			streamReader.close();
			fileReader.close();
			socketWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	
		
		

	}

}
 
分享到:
评论

相关推荐

    Socket编程-Linux.zip

    服务器端采用多线程并发模式,服务器可以同时接收多个客户端的请求,并且回复客户端相同的信息。编译时应该使用命令“gcc server.c -o server -lpthread ”和“gcc client.c -o client -lpthread”

    网络编程课程设计报告-Android-Socket-聊天室.doc

    (4)关闭套接字 四、系统流程图 五、系统设计 本课程设计按照系统的具体功能要求,首先应用Socket编程创建客户端和服务器端, 每多个客户端服务器端就会相因的创建一个线程,它们之间通过这个连接来实现数据通 信;...

    Java TCPIP Socket编程 源码

    一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一个,客户端TCP向服务器端TCP发送连接请求,服务器端的...

    cc_to_sever.zip

    java多线程socket通信、java网络编程学习心得,基本实现多线程通信,其他问题的欢饮反馈。应付作业有余了: 应用多线程实现服务器与多客户端之间的通信: ① 服务器端创建ServerSocket,循环调用accept()等待客户端...

    学习笔记:多线程Java Socket编程示例

    其中采用Java 的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 注意,此为学习笔记,可以作为参考学习使用,不建议商业使用或生产使用。 废话不多说,直接上代码。

    多线程Java Socket编程

    采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.  1.服务端  package localSocket;  import java.io.BufferedReader;  import java.io.IOException; ...

    socket编程,CS间相互通讯(含实验报告)

    1)设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。 2)服务端程序能响应单个或任意多个客户端连接...

    基于I/O、多线程、GUI的标准考试系统v1.0(JAVA实现)

    本系统是基于JAVA开发平台,运用Socket网络编程,I/O文件流,线程,Swing图形界面等技术,实现的一套标准化考试系统。通过该系统可以完成多个科目的标准化考试工作。 该系统共分为三个模块:考生客户端,服务器端和...

    java一个简单的即时通讯工具的设计与开发.rar

    服务器端:使用Java Socket编程实现服务器端,监听客户端连接请求,接收和处理客户端发送的消息,并进行转发。 数据库存储:采用关系型数据库(如MySQL)存储用户信息、好友关系等数据。 多线程处理:使用多线程...

    基于socket的聊天系统设计

    摘要:本设计通过研究讨论,设计基于socket编程的网络聊天系统,服务器端采用多线程并发服务方式,多客户端能同时连接服务器,并且客户端之间能进行通信。程序通过了验证与测试,证明了系统的可用性、易用性、完善性...

    JAVA文件传输的实现.rar

    多线程处理:通过多线程实现并发处理多个文件传输请求,提高传输效率。 异常处理:处理网络异常、文件读写异常等,确保文件传输的稳定性和可靠性。 应用领域: Java文件传输的实现可以应用于各个领域,包括但不限于...

    Java毕业设计-Java聊天室程序(java).rar

    2. **多线程**:服务器端使用多线程处理客户端的连接请求,确保程序能够同时处理多个用户的聊天请求。 3. **数据持久化**:使用SQLite数据库存储用户信息和聊天记录,确保数据的安全性和完整性。 4. **易于扩展**:...

    Socket

    参考MSDN上的Socket例程,以Form为框架,写的关于Socket通信的一个例子,有SocketServer(服务器端)和SocketClient(客户端)两部分,对理解多线程和Socket基本编程有一定的帮助,其中仍有一些地方有待改进。

    局域网监控系统的开发

    本文首先介绍了可以实现局域网监控基础Socket编程的基本概念及其调用的方法,多线程的相关概念及套接字的使用方法,接着从建立Socket套接字开始,完成各功能模块的系统实施,主要包括从鼠标锁定,到关机,到时时截屏...

    MFC网络编程之自制浏览器

    基于TCP的socket编程的服务器端程序流程如下: 1、创建套接字 2、将套接字绑定到一个本地地址和端口号上(bind) 3、将套接字设为监听模式,准备接受客户请求(listen) 4、等待客户请求,请求到来时接受请求,建立...

    linux网络编程-宋敬彬-part1

    4.4.1 多线程编程实例 127 4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号...

    基于Java的远程视频会议系统的实现.rar

    服务器端技术:使用Java技术实现服务器端的业务逻辑和会议管理功能,如多线程编程、数据持久化等。 安全性考虑: 数据加密:对视频、音频和聊天数据进行加密处理,确保数据的机密性和完整性。 身份认证:采用安全的...

    C# socket 源码 多人聊天

     所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字...

    Linux高性能服务器编程

    第二部分对高性能服务器编程的核心要素进行了全面深入的剖析,包含Linux网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多...

Global site tag (gtag.js) - Google Analytics