题目
使用Java实现TCP客户端发送消息到服务器
信息
- 类型:问答
- 难度:⭐
考点
TCP Socket编程, 客户端/服务器模型, 基本IO操作
快速回答
实现TCP客户端-服务器通信的基本步骤:
- 服务器端创建
ServerSocket监听端口 - 客户端创建
Socket连接服务器 - 通过
InputStream/OutputStream读写数据 - 使用
try-with-resources确保资源关闭
原理说明
Java网络编程基于TCP/IP协议栈,使用Socket和ServerSocket类实现客户端-服务器通信:
- 服务器端:创建
ServerSocket在指定端口监听客户端连接请求 - 客户端:创建
Socket指定服务器IP和端口建立连接 - 数据传输:通过
Socket获取的输入/输出流进行字节数据读写
代码示例
服务器端代码:
// SimpleServer.java
try (ServerSocket serverSocket = new ServerSocket(8080)) {
System.out.println("服务器启动,等待连接...");
try (Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()))) {
String message = in.readLine();
System.out.println("收到客户端消息:" + message);
}
} catch (IOException e) {
e.printStackTrace();
}客户端代码:
// SimpleClient.java
try (Socket socket = new Socket("localhost", 8080);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
out.println("Hello Server!");
System.out.println("消息已发送");
} catch (UnknownHostException e) {
System.err.println("未知主机:" + e.getMessage());
} catch (IOException e) {
System.err.println("IO异常:" + e.getMessage());
}最佳实践
- 资源管理:使用
try-with-resources自动关闭Socket和流,避免资源泄漏 - 异常处理:明确捕获
IOException和UnknownHostException - 缓冲读写:使用
BufferedReader/PrintWriter包装字节流提升效率 - 端口选择:使用1024-65535的端口,避免系统保留端口
常见错误
- 未关闭资源:导致文件描述符耗尽(使用try-with-resources解决)
- 端口冲突:多个程序监听同一端口引发
BindException - 阻塞未处理:
accept()和read()会阻塞线程,需注意超时控制 - 字符编码问题:读写文本时未指定统一编码(默认使用UTF-8)
扩展知识
- UDP通信:使用
DatagramSocket和DatagramPacket实现无连接通信 - 多线程处理:服务器端可用
ExecutorService处理并发连接 - NIO:Java New I/O包提供非阻塞IO模型(
Selector,Channel) - 超时设置:通过
setSoTimeout()设置Socket操作超时时间