侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用Java实现一个简单的TCP客户端和服务器,实现客户端发送消息,服务器接收并打印

2025-12-13 / 0 评论 / 4 阅读

题目

使用Java实现一个简单的TCP客户端和服务器,实现客户端发送消息,服务器接收并打印

信息

  • 类型:问答
  • 难度:⭐

考点

TCP Socket编程, 客户端/服务器模型, 基本IO操作

快速回答

实现步骤:

  1. 服务器端:创建ServerSocket监听端口,accept()等待连接,通过InputStream读取数据
  2. 客户端:创建Socket连接服务器,通过OutputStream发送数据
  3. 关键类ServerSocket(服务器)、Socket(客户端)、InputStream/OutputStream
  4. 注意事项:使用try-with-resources自动关闭资源,指定字符编码(如UTF-8)
## 解析

1. 原理说明

TCP是一种可靠的、面向连接的传输协议。Java通过java.net.Socketjava.net.ServerSocket类实现TCP通信:

  • ServerSocket:在服务器端监听指定端口,等待客户端连接
  • Socket:客户端主动连接服务器,或服务器接受连接后创建的通信端点
  • 数据传输通过InputStreamOutputStream完成

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()防止无限期阻塞