java tcp通信核心是socket与serversocket配合io流:服务端监听端口、accept阻塞等待连接并为每个客户端分配独立socket;客户端主动连接,成功即通道就绪;双方通过inputstream/outputstream收发字节流,需注意flush和资源关闭。

Java 中基于 TCP 协议实现客户端与服务端通信,核心是用 Socket(客户端)和 ServerSocket(服务端)配合输入输出流完成数据交换。整个过程依赖操作系统内核管理的可靠连接,开发者只需关注连接建立、读写逻辑和资源释放。
服务端用 ServerSocket 监听并接受连接
服务端程序启动后,需绑定一个本地端口,持续等待客户端发起连接请求。调用 accept() 方法会阻塞,直到有客户端完成三次握手,此时返回一个代表该连接的 Socket 对象。
- 创建时可指定端口、连接队列长度(backlog,默认约50),以及绑定的具体网卡 IP(多网卡环境适用)
- 每个
accept()返回的Socket是独立的,对应一个客户端连接;若要支持多个客户端,必须为每个连接分配新线程或交由线程池处理 - 不要在主线程中直接处理业务逻辑,否则后续客户端请求会被阻塞
客户端用 Socket 主动发起连接
客户端通过构造 Socket 实例,向服务端 IP 和端口发起连接。一旦构造成功(不抛异常),说明三次握手已完成,通道已就绪。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可使用
new Socket("127.0.0.1", 8080)或new Socket(InetAddress.getByName("host"), 8080) - 连接过程默认有超时机制,如需控制,可用带超时参数的构造方法(如
Socket(String, int, InetAddress, int)的变体或 setSoTimeout) - 连接失败会抛出
IOException(如 Connection refused)、UnknownHostException等,需捕获处理
通过 InputStream 和 OutputStream 收发数据
TCP 是字节流协议,通信双方通过套接字获取输入流(接收)和输出流(发送),以流方式读写数据,无需关心分包、粘包(但实际开发中需自行处理)。
- 服务端从
clientSocket.getInputStream()读取客户端发来的数据;用clientSocket.getOutputStream()向该客户端回传 - 客户端同理:用
socket.getInputStream()接收响应,socket.getOutputStream()发送请求 - 建议包装为
BufferedReader/PrintWriter或DataInputStream/DataOutputStream,便于按行或按类型读写(如readUTF()、writeUTF()) - 每次写入后注意调用
flush(),尤其使用缓冲类时,否则数据可能滞留在缓冲区未发出
连接关闭与资源清理不能省略
TCP 连接是系统级资源,必须显式关闭。未关闭会导致端口占用、文件描述符泄漏,严重时服务不可用。
- 先关闭流(
close()输入流和输出流),再关闭套接字(socket.close());关闭套接字会自动关闭其关联流 - 服务端的
ServerSocket在退出前也应调用close(),释放监听端口 - 推荐使用 try-with-resources 语法自动管理流和 Socket,避免遗漏
- 断开连接时触发四次挥手,确保双向数据均已处理完毕
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










