作为一名 Java 开发工程师,你一定在实际开发中遇到过需要建立稳定连接、可靠传输、有序通信等场景。这时,TCP(Transmission Control Protocol) 通信就成为你必须掌握的重要技能之一。

TCP 是一种面向连接、可靠、基于字节流的传输协议,广泛应用于网页请求、文件传输、数据库通信、远程调用等对数据完整性要求较高的场景。

本文将带你全面掌握:

  • TCP 的基本概念与特点
  • TCP 与 UDP 的区别
  • Java 中的 TCP 编程核心类(SocketServerSocket
  • TCP 通信的完整实现(客户端与服务端)
  • TCP 的粘包与拆包问题处理
  • 多线程处理 TCP 请求
  • 实战:构建简单的 TCP 聊天程序、远程命令执行、文件传输
  • 常见误区与最佳实践

并通过丰富的代码示例和真实项目场景讲解,帮助你写出更高效、更安全、结构更清晰的 Java TCP 通信代码。


🧱 一、什么是 TCP?

✅ TCP(Transmission Control Protocol)定义:

TCP 是一种面向连接、可靠、基于字节流的传输协议,它在发送数据前需要建立连接(三次握手),数据传输结束后释放连接(四次挥手)。

✅ TCP 的特点:

特点描述
面向连接发送数据前必须先建立连接
可靠传输数据不会丢失,保证顺序
面向字节流数据以字节流形式传输
有流量控制和拥塞控制自动调整传输速率
传输效率较低由于确认机制、重传机制,延迟较高
适用场景文件传输、网页请求、数据库通信、远程登录等

🔍 二、TCP 与 UDP 的区别

对比项TCPUDP
是否连接是(三次握手)否(无连接)
是否可靠是(有确认机制)否(无确认)
数据顺序保证顺序不保证顺序
传输效率相对较低
适用场景文件传输、网页请求、数据库通信视频会议、游戏、广播通信
Java 类SocketServerSocketDatagramSocketDatagramPacket

🧠 三、Java 中的 TCP 编程核心类

✅ 1. ServerSocket

用于监听客户端连接,是 TCP 服务端的核心类。

✅ 2. Socket

用于客户端与服务端之间的通信,代表一个连接。

✅ 3. InputStream / OutputStream

用于读取和写入数据流。


🧪 四、Java TCP 通信实战示例

示例1:TCP 服务端(单线程)

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();}
}

示例2:TCP 客户端

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 是面向字节流的协议,没有消息边界
  • 操作系统或网络设备的缓冲区合并或拆分

✅ 解决方案:

  1. 自定义协议头(如消息长度、消息类型)
  2. 使用分隔符(如 \n\r\n
  3. 使用固定长度的消息体
  4. 使用 Netty 的 LineBasedFrameDecoderDelimiterBasedFrameDecoder 等解码器

🧩 六、多线程处理 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);
}

场景3:TCP 文件传输

// 客户端发送文件
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)
使用缓冲流提高效率如 BufferedReaderBufferedWriter
使用多线程处理并发请求服务端应为每个连接创建新线程或使用线程池
使用协议封装通信数据自定义协议头、长度、内容,避免粘包
使用日志记录通信方便排查问题
使用异常处理机制捕获 IOExceptionUnknownHostException 等
使用 NIO 提升性能如 SocketChannel + Selector
使用 Netty 构建高性能 TCP 应用更高级的网络通信框架
使用 KeepAlive 保持连接避免连接意外断开

🚫 九、常见误区与注意事项

误区正确做法
忘记关闭 socket使用 try-with-resources 自动关闭
不设置超时导致程序挂起,应设置连接和读取超时
不处理异常必须捕获并处理网络异常
不使用缓冲流导致频繁 IO 操作,效率低
忽略协议设计导致粘包、拆包问题,应设计协议头
使用字节流直接转字符串应使用 InputStreamReader 指定编码
忽略并发处理服务端应支持多线程或 NIO
不使用日志记录通信难以排查问题,应记录请求和响应
不使用 KeepAlive应设置 socket.setKeepAlive(true)
不使用 NIO高并发下应使用非阻塞 IO 提升性能

📊 十、总结:Java TCP 通信核心知识点一览表

内容说明
TCP 定义面向连接、可靠、基于字节流的传输协议
TCP 特点保证顺序、有确认机制、适合高可靠性传输
Java 类SocketServerSocketInputStreamOutputStream
通信流程建立连接 → 读写数据 → 释放连接
粘包/拆包需要设计协议头或使用分隔符处理
实际应用聊天程序、远程调用、文件传输、数据库连接
最佳实践显式关闭资源、设置超时、协议设计、多线程
注意事项异常处理、日志记录、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核心技术深度解析!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915844.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915844.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915844.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5 网页游戏设计开发——1、HTML基础

前言 互联网上的应用程序被称为Web程序,Web引用用程序是用Web文档(网页)累表现用户界面,而Web文档都遵守HTML格式。HTML5是最新的HTML标准。之前的版本HTML4.01于1999年发布,小20年过去了,互联网已经发声了…

opencv圖片標注

功能使用python opencv, 將文字信息標注在圖片中同一張圖片中涉及多次標注文字大小為標注框的0.3倍使用多綫程運行import cv2 import threading import numpy as npdef draw_annotations(item, annotations):"""在图片上绘制标注框和文本annotations: 标注列表…

矩阵SVD分解计算

对于有数学库的时候,进行矩阵相关计算还是不复杂,但是没有数学库就很麻烦,利用算法实现了矩阵奇异值分解。 void decompose(const std::vector<std::vector<double>>& A, std::vector<std::vector<double>>& U, std::vector<dou…

Flutter基础(前端教程①⑦-Column竖直-Row水平-Warp包裹-Stack堆叠)

MainAxisAlignment 是一个枚举类&#xff0c;用于控制主轴&#xff08;Main Axis&#xff09; 方向上子组件的排列和对齐方式。MainAxisAlignment 的常用取值及效果&#xff1a;MainAxisAlignment.start子组件沿主轴的起点对齐&#xff08;Row 左对齐&#xff0c;Column 顶部对…

构建智能视频中枢--多路RTSP转RTMP推送模块在轨道交通与工业应用中的技术方案探究

1️⃣ 行业背景与技术需求&#x1f688; 轨道交通行业对视频监控的深度依赖在现代城市轨道交通系统中&#xff0c;视频监控已不仅仅是安防的一部分&#xff0c;更是贯穿于运营管理、车辆调度、应急指挥和安全保障的核心技术手段。列车车载监控 ——列车上普遍部署多路高清摄像头…

【Android Studio 2025 汉化教程】

废话不多说&#xff0c;直接上干货。 前提&#xff1a;JeBrains系列2025版已经集成中文插件&#xff0c;用户不需下载&#xff0c;只要设置下即可&#xff0c;但Android Studio并不内置也不提供汉化插件。需要工具&#xff1a; 1.IDEA&#xff08;其他JeBrains系列也可以&#…

网络安全初级(前端页面的编写分析)

源代码index.html<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录页面</title><!--…

RAG项目实战:LangChain 0.3集成 Milvus 2.5向量数据库,构建大模型智能应用

项目背景 最近&#xff0c;有时间&#xff0c;想着动手实战一下&#xff0c;从0到1搭建一个 RAG 系统&#xff0c;也是想通过实战的方式来更进一步学习 RAG。因此&#xff0c;就定下了以项目实战为主&#xff0c;书籍为辅的执行方式。&#xff08;书籍是黄佳老师著的《RAG 实战…

docker build 和compose 学习笔记

目录 docker build 笔记 1. 路径解析 2. 关键注意事项 2. docker compose up -d 核心区别对比 常见工作流 补充说明 1. 功能区别 2. 协作关系 场景 1&#xff1a;Compose 自动调用 Build 场景 2&#xff1a;先 Build 后 Compose 3. 关键区别 4. 为什么需要协作&…

Java学习第六十六部分——分布式系统架构

目录 一、前言提要 二、核心目标 三、核心组件与技术 1. 服务拆分与通信 2. 服务注册与发现 3. 配置中心 4. 负载均衡 5. 熔断、降级与限流 6. API 网关 7. 分布式数据管理 8. 分布式追踪与监控 9. 容器化与编排 四、典型Java分布式技术栈组合 五、关键…

Pycharm的Terminal打开后默认是python环境

Pycharm的Terminal打开后默认是python环境解决方案Pycharm的Terminal打开后默认是python环境&#xff0c;无法执行pip等命令&#xff0c;也没办法退出 解决方案 点击Settings -> Tools -> Terminal 可以看到当前默认打开的是torch19py38环境中的python.exe&#xff08;…

LVS——nat模式

一、搭建nat模式下LVS的实验环境1.创建四台虚拟机client——客户端&#xff1a;192.168.134.111/24&#xff08;nat模式&#xff09;LVS——调度器【双网卡】&#xff1a;192.168.134.112/24&#xff08;nat模式&#xff09;、172.25.254.111/24&#xff08;仅主机模式&#xf…

ElasticSearch是什么

ElasticSearch是什么 ElasticSearch 是一个基于 Apache Lucene 的开源分布式搜索引擎&#xff0c;用于全文搜索、日志分析、实时数据分析等场景。它以高性能、分布式架构和易用性著称&#xff0c;支持 JSON 格式的数据存储和查询&#xff0c;广泛应用于日志监控、搜索服务、企业…

linxu CentOS 配置nginx

1、准备要发布的文件夹sudo mkdir -p /var/www/myfiles # 创建文件夹&#xff08;如果不存在&#xff09; sudo chmod -R 755 /var/www/myfiles # 设置权限&#xff08;确保 Nginx 可以读取&#xff09; sudo chown -R nginx:nginx /var/www/myfiles # 修改所有者&#xff0…

内网穿透利器:基于HTTPHTTPS隧道的代理工具深度解析

内网穿透利器&#xff1a;基于HTTP/HTTPS隧道的代理工具深度解析 一、引言 在渗透测试和内网渗透中&#xff0c;HTTP/HTTPS隧道技术是突破网络边界的关键手段。它通过将TCP流量封装在HTTP协议中&#xff0c;穿透防火墙/NACL策略&#xff0c;实现内网横向移动。本文以reGeorg为…

容器编排K8S

k8s概述 容器部署优势:部署方便,不依赖底层环境,升级镜像 本质是一个容器编排工具,golang语言开发 master master管理节点:kube-api-server请求接口,kube-scheduler调度器,kube-controller-manager控制器/管理器,etcd分布式存储数据库 work node服务节点:kubelet代理保…

C语言:深入理解指针(1)

1. 内存和地址在了解指针前&#xff0c;我们需要知道内存和地址是什么。1.1 内存首先来看内存。举个例子&#xff1a;当你在酒店找房间时&#xff0c;你并不是一层一层一间一间找&#xff0c;而是通过酒店为每间房子设置的门牌号直接找到你的房间&#xff0c;这样的效率就会快很…

完整的 SquareStudio 注册登录功能实现方案:已经烧录到开发板正常使用

根据你的需求&#xff0c;我将提供完整的实现方案&#xff0c;解决按钮同时执行多个动作的问题&#xff0c;并确保注册登录功能正常工作。所需文件结构需要创建和修改的文件如下&#xff1a;ui_events.h - 事件处理函数声明events.c - 实际的事件处理逻辑ui.c - UI 初始化和事件…

OkHttp 与 Chuck 结合使用:优雅的 Android 网络请求调试方案

前言在 Android 应用开发过程中&#xff0c;网络请求调试是日常工作中不可或缺的一部分。Chuck 是一个轻量级的 OkHttp 拦截器&#xff0c;能够在应用内直接显示网络请求和响应的详细信息&#xff0c;无需连接电脑或使用额外工具。本文将详细介绍如何将 OkHttp 与 Chuck 结合使…

AI学习--本地部署ollama

AI小白&#xff0c;记录下本地部署ollama1.下载安装ollama下载地址ollama官方地址https://ollama.com/download根据系统下载即可下面是我下载的地址 https://release-assets.githubusercontent.com/github-production-release-asset/658928958/e8384a9d-8b1e-4742-9400-7a0ce2a…