Java 使用多线程技术编写一个支持多客户端的回显服务器

服务器可以连接维护多个客户端的连接,服务器收到某个客户端的消息后,会将消息原封不动的返回给客户端。


步骤一:

创建服务器类:MultiThreadEchoServer,完成服务器套接字的创建和监听。

步骤二:

在MultiThreadEchoServer 中定义线程内部类:ClientHandler,ClientHandler用于完成和某一个

客户端的交互。

第三步:

修改程序MultiThreadEchoSrevr,定义start方法,实现循环接收客户端的连接请求,每当建立一个与客户端连接socket,就创建该客户端对应的ClientHandler线程与之交互。

全部代码如下:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class MultiThreadEchoServer {
    private int port;
    private ServerSocket tcpServer;
    private boolean isRunning;//判断服务器是否在运行
    public MultiThreadEchoServer(int port){
    	this.port=port;
    	try{
    		tcpServer=new ServerSocket(port);//创建serverSocket对象,绑定监听port端口
    		isRunning=true;
    		System.out.printf("MultiThreadEchoServer服务器绑定端口成功,监听绑定port端口\n",port);
    		
    	}catch(IOException e){
    		e.printStackTrace();
    	}
    }
    class Clienthandler implements Runnable{//实现runnable 接口
         private Socket socket;
         private String clientip;
         private int clientPort;
         private DataInputStream in;
         private DataOutputStream out;
         private boolean isConnected;//判断是否连接
         Clienthandler(Socket socket )throws IOException {//构造方法
			this.socket=socket;
			if(null!=socket){
				clientip=socket.getInetAddress().getHostAddress();//获取客户端的ip地址
				clientPort=socket.getPort();//获取客户端的端口
				in =new DataInputStream(socket.getInputStream());//由套接字输入创建数据输入流
				out=new DataOutputStream(socket.getOutputStream());//由套接字输出创建数据输出流
				isConnected=true;
				System.out.printf("客户端连接成功,客户端是(%s:%d)\n",clientip,clientPort);
				
			}
		}
         private void closeConnect(){
        	 isConnected=false;
        	 if(socket!=null){
        		 try{
        			 socket.close();
        			 
        		 }catch(IOException e){
        			 socket=null;
        		 }
        	 }
         }
		@Override
		public void run() {
		while(isConnected){
			String msg;
			try{
				msg=in.readUTF();
				System.out.printf("服务器收到来自{%s:%d}的消息:{%s}\n",clientip,clientPort,msg);
				out.writeUTF(msg);
				
			}catch(IOException e){
				System.out.println("客户端断开tcp连接,程序退出");
				closeConnect();
				
			}
		}
			
		}
    	
    }
    public void start(){
    	while(isRunning){
    		try{
    			Socket socket=tcpServer.accept();
    			Thread client=new Thread(new Clienthandler(socket));//创建ClientHander 线程,将Socket传递给对应的构造方法
    			client.start();
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    }
    
    
    
	public static void main(String[] args) {
		MultiThreadEchoServer srever=new MultiThreadEchoServer(8000);//创建MultiThreadEchoServer对象,监听8000号端口

		srever.start();
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_42442713/article/details/80901108