Java TCP 通信詳解:從基礎到實戰,徹底掌握面向連接的網絡編程

作為一名 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…