Java Socket编程实例:TCP基本通信原理与代码

小林子
小林子
发布时间:2026-10-13 | 3人浏览过
原创

Java Socket编程是构建网络应用的基础。本文介绍如何使用Java标准库实现一个简单的TCP Echo Server与Client,通过实际代码解析`ServerSocket`监听、`Socket`连接以及输入输出流的读写流程,帮助开发者掌握网络通信的基本模式。

结果与目标

本例的目标是实现一个可靠的TCP通信模型:服务器端在特定端口监听请求,一旦有客户端连接,便读取其发送的数据,并将完全相同的数据原样返回(即“回声”效果)。此过程验证了Java IO流在网络传输中的可靠性,为后续处理更复杂协议打下基础。

准备条件

  • 环境需安装JDK并确保java.net.*和java.io.*包可用。
  • 风险提示:Socket编程涉及底层资源管理,务必确保在finally块中关闭Socket与流,否则可能导致连接泄漏或文件句柄耗尽。建议在正式项目中采用try-with-resources语法。

真实操作顺序

第1步:构建服务端并启动监听

目的:创建一个能够接受多个客户端连接的TCP服务器。服务器需要绑定到特定的IP和端口(例如5500),并通过循环等待新连接。

入口:主类 TCPEchoServer。

  1. 定义端口常量与服务缓冲区大小(如32字节)。
  2. 使用 new ServerSocket(servPort) 创建监听 socket。
  3. 进入无限循环调用 servSock.accept() 挂起直到客户端发起连接。
  4. 获取客户端地址信息用于日志记录。
import java.net.*;
import java.io.*;

public class TCPEchoServer {
  private static final int BUFSIZE = 32;

  public static void main(String[] args) throws IOException {
    int servPort = 5500;
    // 创建并绑定服务器套接字
    ServerSocket servSock = new ServerSocket(servPort);

    while (true) { // 永久运行,接受和处理连接
      Socket clntSock = servSock.accept(); // 阻塞等待并接受连接
      System.out.println("Handling client at " + clntSock.getRemoteSocketAddress());

      // 获取输入输出流以进行数据传输
      InputStream in = clntSock.getInputStream();
      OutputStream out = clntSock.getOutputStream();
      byte[] receiveBuf = new byte[BUFSIZE];
      int recvMsgSize;

      // 持续读取直到客户端断开(返回-1)
      while ((recvMsgSize = in.read(receiveBuf)) != -1) {
        // 将收到的数据立即写回给客户端
        out.write(receiveBuf, 0, recvMsgSize);
      }

      clntSock.close(); // 处理完当前会话后关闭socket
    }
  }
}

第2步:编写客户端发送与接收逻辑

目的:连接到指定地址的服务端,发送测试字符串,并验证是否能正确收到相同的响应。

入口:主类 TCPEchoClient。

  1. 初始化服务器IP地址(本地通常为 127.0.0.1)与对应端口。
  2. 构造待发送的字节数据(如 “Hi, World”)。
  3. 实例化 Socket(server, servPort) 自动建立连接。
  4. 利用 out.write() 发送数据至服务端。
import java.net.*;
import java.io.*;

public class TCPEchoClient {
  public static void main(String[] args) throws IOException {
    String server = "127.0.0.1";
    int servPort = 5500;
    byte[] data = "Hi, World".getBytes();

    // 建立与服务器的连接
    Socket socket = new Socket(server, servPort);
    System.out.println("Connected to server...sending echo string");

    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();

    out.write(data); // 发送数据

    // 循环读取直到收全所有字节
    int totalBytesRcvd = 0;
    int bytesRcvd;
    while (totalBytesRcvd < data.length) {
      if ((bytesRcvd = in.read(data, totalBytesRcvd, data.length - totalBytesRcvd)) == -1)
        throw new SocketException("Connection closed prematurely");
      totalBytesRcvd += bytesRcvd;
    }

    // 打印确认收到的内容
    System.out.println("Received: " + new String(data));
    socket.close();
  }
}

第3步:执行结果与状态检查

完成判断:启动服务端程序后,控制台应显示 Handling client at ...;随后启动客户端,客户端控制台打印 Received: Hi, World 即表示成功完成了一次TCP双向通信。注意:默认的单线程服务端模型一次只能处理一个活跃连接。

原文有依据的排错

若遇到 BindException,请检查端口5500是否被其他进程占用。若出现 SocketException: Connection refused,请确认服务端已启动且客户端IP/端口配置一致。此外,单线程服务端不适合高并发场景,实际应用中需引入多线程机制。

简要总结

本文梳理了Java Socket编程在TCP环境下的核心实现步骤,从ServerSocket的搭建到Socket的数据收发,提供了可运行的基础代码片段。以上就是Java Socket编程TCP基本使用的详细内容,更多关于Java网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表