有哪些建设网站公司吗,做品牌网站,wordpress超cpu,环球外贸作为一名 Java 开发工程师#xff0c;你一定在实际开发中遇到过需要建立稳定连接、可靠传输、有序通信等场景。这时#xff0c;TCP#xff08;Transmission Control Protocol#xff09; 通信就成为你必须掌握的重要技能之一。TCP 是一种面向连接、可靠、基于字节流的传输协…作为一名 Java 开发工程师你一定在实际开发中遇到过需要建立稳定连接、可靠传输、有序通信等场景。这时TCPTransmission Control Protocol 通信就成为你必须掌握的重要技能之一。TCP 是一种面向连接、可靠、基于字节流的传输协议广泛应用于网页请求、文件传输、数据库通信、远程调用等对数据完整性要求较高的场景。本文将带你全面掌握TCP 的基本概念与特点TCP 与 UDP 的区别Java 中的 TCP 编程核心类Socket、ServerSocketTCP 通信的完整实现客户端与服务端TCP 的粘包与拆包问题处理多线程处理 TCP 请求实战构建简单的 TCP 聊天程序、远程命令执行、文件传输常见误区与最佳实践并通过丰富的代码示例和真实项目场景讲解帮助你写出更高效、更安全、结构更清晰的 Java TCP 通信代码。一、什么是 TCP✅ TCPTransmission Control Protocol定义TCP 是一种面向连接、可靠、基于字节流的传输协议它在发送数据前需要建立连接三次握手数据传输结束后释放连接四次挥手。✅ TCP 的特点特点描述面向连接发送数据前必须先建立连接可靠传输数据不会丢失保证顺序面向字节流数据以字节流形式传输有流量控制和拥塞控制自动调整传输速率传输效率较低由于确认机制、重传机制延迟较高适用场景文件传输、网页请求、数据库通信、远程登录等二、TCP 与 UDP 的区别对比项TCPUDP是否连接是三次握手否无连接是否可靠是有确认机制否无确认数据顺序保证顺序不保证顺序传输效率相对较低高适用场景文件传输、网页请求、数据库通信视频会议、游戏、广播通信Java 类Socket、ServerSocketDatagramSocket、DatagramPacket三、Java 中的 TCP 编程核心类✅ 1. ServerSocket用于监听客户端连接是 TCP 服务端的核心类。✅ 2. Socket用于客户端与服务端之间的通信代表一个连接。✅ 3. InputStream / OutputStream用于读取和写入数据流。四、Java TCP 通信实战示例示例1TCP 服务端单线程
import java.io.*;
import java.net.*;public class TcpServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket new ServerSocket(8888);System.out.println(服务端启动等待连接...);Socket socket serverSocket.accept(); // 等待客户端连接BufferedReader reader new BufferedReader(new InputStreamReader(socket.getInputStream()));String line reader.readLine();System.out.println(收到客户端消息 line);socket.close();serverSocket.close();}
}
示例2TCP 客户端
import java.io.*;
import java.net.*;public class TcpClient {public static void main(String[] args) throws IOException {Socket socket new Socket(127.0.0.1, 8888);PrintWriter writer new PrintWriter(socket.getOutputStream(), true);writer.println(Hello Server);socket.close();}
}五、TCP 的粘包与拆包问题✅ 什么是粘包与拆包粘包Sticky Packet多个数据包被合并成一个包接收。拆包Split Packet一个数据包被拆分成多个包接收。✅ 原因TCP 是面向字节流的协议没有消息边界操作系统或网络设备的缓冲区合并或拆分✅ 解决方案自定义协议头如消息长度、消息类型使用分隔符如 \n、\r\n使用固定长度的消息体使用 Netty 的 LineBasedFrameDecoder、DelimiterBasedFrameDecoder 等解码器六、多线程处理 TCP 请求服务端并发处理
import java.io.*;
import java.net.*;
import java.util.concurrent.*;public class MultiThreadTcpServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket new ServerSocket(8888);ExecutorService pool Executors.newCachedThreadPool();System.out.println(服务端启动等待连接...);while (true) {Socket socket serverSocket.accept();pool.execute(new ClientHandler(socket));}}static class ClientHandler implements Runnable {private final Socket socket;public ClientHandler(Socket socket) {this.socket socket;}Overridepublic void run() {try {BufferedReader reader new BufferedReader(new InputStreamReader(socket.getInputStream()));String line;while ((line reader.readLine()) ! null) {System.out.println(收到消息 line);}socket.close();} catch (IOException e) {e.printStackTrace();}}}
}七、TCP 通信实战应用场景场景1构建 TCP 聊天程序多线程
// 服务端
new Thread(() - {try (ServerSocket serverSocket new ServerSocket(8888)) {while (true) {Socket socket serverSocket.accept();new Thread(() - {try (BufferedReader reader new BufferedReader(new InputStreamReader(socket.getInputStream()))) {String line;while ((line reader.readLine()) ! null) {System.out.println(收到消息 line);}} catch (IOException e) {e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}
}).start();// 客户端
Socket socket new Socket(127.0.0.1, 8888);
PrintWriter writer new PrintWriter(socket.getOutputStream(), true);
writer.println(你好服务器);
场景2远程命令执行如 Telnet
// 服务端接收命令并执行
Process process Runtime.getRuntime().exec(line);
BufferedReader resultReader new BufferedReader(new InputStreamReader(process.getInputStream()));
String resultLine;
while ((resultLine resultReader.readLine()) ! null) {writer.println(resultLine);
}
场景3TCP 文件传输
// 客户端发送文件
FileInputStream fis new FileInputStream(send.txt);
OutputStream os socket.getOutputStream();
byte[] buffer new byte[1024];
int bytesRead;
while ((bytesRead fis.read(buffer)) ! -1) {os.write(buffer, 0, bytesRead);
}
os.flush();// 服务端接收文件
FileOutputStream fos new FileOutputStream(received.txt);
InputStream is socket.getInputStream();
byte[] buffer new byte[1024];
int bytesRead;
while ((bytesRead is.read(buffer)) ! -1) {fos.write(buffer, 0, bytesRead);
}八、TCP 通信最佳实践实践描述显式关闭资源使用 try-with-resources 或 finally 块关闭 socket、流设置超时时间避免长时间阻塞如 socket.setSoTimeout(3000)使用缓冲流提高效率如 BufferedReader、BufferedWriter使用多线程处理并发请求服务端应为每个连接创建新线程或使用线程池使用协议封装通信数据自定义协议头、长度、内容避免粘包使用日志记录通信方便排查问题使用异常处理机制捕获 IOException、UnknownHostException 等使用 NIO 提升性能如 SocketChannel Selector使用 Netty 构建高性能 TCP 应用更高级的网络通信框架使用 KeepAlive 保持连接避免连接意外断开九、常见误区与注意事项误区正确做法忘记关闭 socket使用 try-with-resources 自动关闭不设置超时导致程序挂起应设置连接和读取超时不处理异常必须捕获并处理网络异常不使用缓冲流导致频繁 IO 操作效率低忽略协议设计导致粘包、拆包问题应设计协议头使用字节流直接转字符串应使用 InputStreamReader 指定编码忽略并发处理服务端应支持多线程或 NIO不使用日志记录通信难以排查问题应记录请求和响应不使用 KeepAlive应设置 socket.setKeepAlive(true)不使用 NIO高并发下应使用非阻塞 IO 提升性能十、总结Java TCP 通信核心知识点一览表内容说明TCP 定义面向连接、可靠、基于字节流的传输协议TCP 特点保证顺序、有确认机制、适合高可靠性传输Java 类Socket、ServerSocket、InputStream、OutputStream通信流程建立连接 → 读写数据 → 释放连接粘包/拆包需要设计协议头或使用分隔符处理实际应用聊天程序、远程调用、文件传输、数据库连接最佳实践显式关闭资源、设置超时、协议设计、多线程注意事项异常处理、日志记录、KeepAlive、NIO 使用十一、附录Java TCP 通信常用技巧速查表技巧示例获取本机 IP 地址InetAddress.getLocalHost().getHostAddress()获取远程 IP 地址socket.getInetAddress().getHostAddress()设置连接超时socket.setSoTimeout(5000)使用缓冲流new BufferedReader(new InputStreamReader(...))使用 NIO 实现非阻塞通信SocketChannel Selector使用线程池处理客户端连接ExecutorService 处理每个 socket 连接使用 Netty 构建高性能 TCP 应用NettyServerBootstrap自定义协议头消息长度 消息内容使用 KeepAlivesocket.setKeepAlive(true)使用 PrintWriter 发送文本writer.println(message)欢迎点赞、收藏、转发也欢迎留言交流你在实际项目中遇到的 TCP 通信相关问题。我们下期再见 关注我获取更多Java核心技术深度解析