一、基本介绍
在Java中,处理TCP请求通常涉及到服务器和客户端的概念。服务器监听某个端口,等待客户端的连接请求,而客户端则发起连接到服务器的请求。在多线程环境中,服务器可以同时处理多个客户端的请求。
二、简单示例
下面是一个简单的示例,展示如何使用Java的ServerSocket
和Socket
类来创建一个多线程的TCP服务器。
1. 服务器端
服务器端使用ServerSocket
来监听端口,每当有客户端连接时,它就创建一个新的线程来处理这个连接。
java
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) throws IOException {
int port = 12345; // 服务器监听的端口
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
Socket clientSocket = serverSocket.accept(); // 接受客户端连接
new ClientHandler(clientSocket).start(); // 为每个客户端创建新线程
}
}
}
class ClientHandler extends Thread {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
OutputStream out = clientSocket.getOutputStream();
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received: " + inputLine);
out.write(("Echo: " + inputLine + "\n").getBytes());
}
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 客户端
客户端使用Socket
来连接服务器,并发送消息。
java
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws IOException {
String hostName = "localhost";
int portNumber = 12345;
Socket socket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
System.out.println("Enter messages (leave empty line to quit):");
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
if (userInput.isEmpty()) {
break;
}
String fromServer = in.readLine();
System.out.println("Echo: " + fromServer);
}
out.close();
in.close();
socket.close();
}
}
说明:
-
服务器端:
- 使用
ServerSocket
在指定端口上监听。 - 每当有新的客户端连接,就创建一个新的
ClientHandler
线程来处理这个连接。 ClientHandler
类继承自Thread
,用于处理客户端的输入和输出。
- 使用
-
客户端:
- 通过
Socket
连接到服务器。 - 发送消息到服务器,并接收服务器的响应。
- 通过
这个示例展示了如何使用Java进行基本的多线程TCP通信。你可以根据需要扩展这个示例,比如添加错误处理、支持更多的并发连接等。