TCP协议的应用,实现一个服务器处理多个客户端请求(向服务器发送消息,服务器接收到后以原消息返回给客户端。)

客户端类

import java.io.*;
import java.net.Socket;
import java.util.Scanner; //先写出后读入
public class EchoMultiClient {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); try {
//创建一个Socket对象,指定要连接的服务器
Socket socket = new Socket("127.0.0.1",6666); //向服务器发送数据,先从socket获得输出流,并包装
PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
System.out.println("请输入要发送的内容:");
String info = input.nextLine();
ps.println(info);
ps.flush(); //读取服务器返回的消息,先从socket获得输入流,并包装
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
info = br.readLine();
System.out.println(info); //关闭流
br.close();
ps.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

服务器类

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 处理多个客户端
* 主线程用于监听客户端的连接,每次有链接成功,开启一个线程来该客户端的消息
*/
public class EchoMultiServer {
public static void main(String[] args) { //创建一个固定大小的线程池
ExecutorService es = Executors.newFixedThreadPool(3); try {
//创建服务器端套接字,并指定端口号
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器已启动,等待连接。。"); //现在不直接处理了,主线程只负责接待,具体操作交由其他线程实现
while (true) {
Socket socket = serverSocket.accept();
System.out.println("一个客户端连接成功。。。" + socket.getInetAddress().getHostAddress()); es.execute(new UserThread(socket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 用来处理客户端请求的线程任务
*/
class UserThread implements Runnable { //处理谁?
private Socket socket; public UserThread(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
//读取客户端请求
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String info = br.readLine();
System.out.println(info); //向客户端返回消息
PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
ps.println("echo:" + info);
ps.flush(); ps.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
05-11 22:15