服务器可以连接维护多个客户端的连接,服务器收到某个客户端的消息后,会将消息原封不动的返回给客户端。
步骤一:
创建服务器类: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();
}
}