实现思路
- 服务器端:
- 创建一个
ServerSocket
实例,绑定到指定端口,监听客户端连接。
- 当有客户端连接时,
accept()
方法会返回一个 Socket
实例,代表与该客户端的连接。
- 为每个客户端连接创建一个新的线程来处理其请求,这样服务器就能同时处理多个客户端。
- 客户端:
- 创建一个
Socket
实例,连接到服务器的指定地址和端口。
- 通过该
Socket
实例的输入输出流与服务器进行数据交互。
关键代码示例
服务器端代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static final int PORT = 12345;
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("Server started on port " + PORT);
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected: " + clientSocket);
// 为每个客户端创建一个新线程来处理请求
Thread clientHandler = new Thread(new ClientHandler(clientSocket));
clientHandler.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class ClientHandler implements Runnable {
private final Socket clientSocket;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try (
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)
) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received from client: " + inputLine);
out.println("Echo: " + inputLine);
if ("exit".equals(inputLine)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端代码
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 Client {
private static final String SERVER_ADDRESS = "localhost";
private static final int SERVER_PORT = 12345;
public static void main(String[] args) {
try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))
) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("Server response: " + in.readLine());
if ("exit".equals(userInput)) {
break;
}
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + SERVER_ADDRESS);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: " + SERVER_ADDRESS);
System.exit(1);
}
}
}