java tcp服务器核心是serversocket与socket配合,分三步:绑定端口监听、accept阻塞接收连接并为每连接启新线程、通过输入输出流收发数据,需用try-with-resources或显式关闭流和socket,并捕获ioexception等异常。

用 Java 原生套接字构建基础 TCP 服务器,核心是 ServerSocket 和 Socket 两个类的配合使用。关键不在于写得多复杂,而在于理清连接建立、数据收发、资源释放这三个环节。
启动服务端并监听端口
服务器必须先绑定一个本地端口,开始等待客户端连接:
- 创建
ServerSocket实例时传入端口号(如8080),该操作会立即绑定端口;若端口被占用或权限不足,会抛出IOException - 构造成功即代表监听已就绪,但此时还不会接收任何连接
- 可选:指定
backlog参数控制连接请求队列长度,避免突发连接被丢弃
接受客户端连接并建立通信通道
accept() 是阻塞方法,它会一直等待,直到有客户端发起 TCP 握手成功:
- 每次调用
accept()返回一个Socket对象,这个对象专用于与当前客户端通信 - 返回的
Socket包含对方 IP 和端口信息,可通过getInetAddress()获取 - 不要在主线程中直接处理业务逻辑,否则下一个客户端必须等前一个处理完——应为每个连接启动独立线程或交由线程池管理
读写数据:基于字节流的双向通信
TCP 是面向字节流的协议,所有通信都通过输入/输出流完成:
- 调用
socket.getInputStream()获取InputStream,用来读取客户端发来的数据 - 调用
socket.getOutputStream()获取OutputStream,用来向客户端发送响应 - 建议搭配
BufferedReader/PrintWriter或DataInputStream/DataOutputStream使用,提升文本或结构化数据处理效率 - 注意流的关闭顺序:通常先关流,再关 Socket;使用 try-with-resources 可自动确保资源释放
优雅关闭与异常处理
网络环境不可靠,必须覆盖常见异常并及时释放资源:
-
IOException最常见,可能发生在读、写、连接中断等任意环节,需捕获并记录日志 -
SocketTimeoutException可用于实现心跳或超时控制(需提前设置setSoTimeout()) - 服务关闭时,主动调用
serverSocket.close(),这会中断accept()的阻塞,让主线程退出循环 - 每个客户端连接的
Socket也应在处理完毕后显式关闭,防止文件描述符泄漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











