题目
使用Java实现一个简单的TCP客户端和服务器,实现客户端发送消息,服务器接收并打印
信息
- 类型:问答
- 难度:⭐
考点
TCP Socket编程, 客户端/服务器模型, 基本IO操作
快速回答
实现步骤:
- 服务器端:创建ServerSocket监听端口,accept()等待连接,通过InputStream读取数据
- 客户端:创建Socket连接服务器,通过OutputStream发送数据
- 关键类:
ServerSocket(服务器)、Socket(客户端)、InputStream/OutputStream - 注意事项:使用try-with-resources自动关闭资源,指定字符编码(如UTF-8)
1. 原理说明
TCP是一种可靠的、面向连接的传输协议。Java通过java.net.Socket和java.net.ServerSocket类实现TCP通信:
- ServerSocket:在服务器端监听指定端口,等待客户端连接
- Socket:客户端主动连接服务器,或服务器接受连接后创建的通信端点
- 数据传输通过
InputStream和OutputStream完成
2. 代码示例
服务器端代码
// TCPServer.java
try (ServerSocket serverSocket = new ServerSocket(8888)) {
System.out.println("服务器启动,等待连接...");
try (Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8))) {
String message = in.readLine();
System.out.println("收到客户端消息:" + message);
}
} catch (IOException e) {
e.printStackTrace();
}客户端代码
// TCPClient.java
try (Socket socket = new Socket("localhost", 8888);
PrintWriter out = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8), true)) {
out.println("Hello Server!");
System.out.println("消息已发送");
} catch (IOException e) {
e.printStackTrace();
}3. 最佳实践
- 资源自动关闭:使用try-with-resources确保Socket和流正确关闭
- 指定字符编码:明确使用UTF-8避免乱码
- 缓冲读写:使用BufferedReader/PrintWriter提升IO效率
- 异常处理:捕获IOException并适当处理(如日志记录)
4. 常见错误
- 端口冲突:端口被占用(如重复启动服务器)
- 未关闭资源:导致内存泄漏或端口占用
- 编码不一致:客户端和服务器使用不同编码造成乱码
- 阻塞未处理:
accept()和readLine()会阻塞线程
5. 扩展知识
- 多客户端处理:服务器使用多线程(
new Thread())或线程池处理并发连接 - UDP对比:
DatagramSocket实现无连接通信,适合广播场景 - NIO:Java New I/O(
java.nio)提供非阻塞IO模型,适合高并发场景 - 超时设置:
setSoTimeout()防止无限期阻塞