Java 實現 TCP 一發一收通信

在網絡編程中,TCP(傳輸控制協議)憑借其可靠傳輸的特性,成為需要確保數據完整性場景的核心選擇。本文將基于一段 Java 代碼實例,全面解析 TCP 單向通信的實現邏輯,幫助開發者掌握 TCP 編程的基礎框架與底層原理。

核心代碼展示

以下是實現 TCP 單向通信的完整代碼,包含客戶端與服務器端兩個部分:

客戶端(Client)代碼

package com.practical.agreement.tcp.tcp_1;
import java.io.OutputStream;
import java.net.Socket;
import java.io.DataOutputStream;
/*
@description:
@ClassName Client
@author chen
@create 2025-07-21 14:53
@Version 1.0
*/
public class Client
{public static void main(String[] args) throws Exception{// 1、創建Socket對象,并同時請求與服務端程序的連接。Socket socket = new Socket("127.0.0.1", 8888);// 2、從socket通信管道中得到一個字節輸出流,用來發數據給服務端程序。OutputStream os = socket.getOutputStream();// 3、把低級的字節輸出流包裝成數據輸出流DataOutputStream dos = new DataOutputStream(os);// 4、開始寫數據出去了dos.writeUTF("發送數據----~~~~~~~");dos.close();// 5、釋放連接資源socket.close(); // 釋放連接資源}
}

服務器端(Server)代碼

package com.practical.agreement.tcp.tcp_1;
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
@description:
@ClassName Server
@author chen
@create 2025-07-21 14:54
@Version 1.0
*/
public class Server
{public static void main(String[] args) throws Exception{System.out.println("-----服務端啟動成功-------");// 1、創建ServerSocket的對象,同時為服務端注冊端口。ServerSocket serverSocket = new ServerSocket(8888);// 2、使用serverSocket對象,調用一個accept方法,等待客戶端的連接請求Socket socket = serverSocket.accept();// 3、從socket通信管道中得到一個字節輸入流。InputStream is = socket.getInputStream();// 4、把原始的字節輸入流包裝成數據輸入流DataInputStream dis = new DataInputStream(is);// 5、使用數據輸入流讀取客戶端發送過來的消息String rs = dis.readUTF();System.out.println(rs);// 其實我們也可以獲取客戶端的IP地址System.out.println(socket.getRemoteSocketAddress());dis.close();socket.close();}
}

一、TCP 協議基礎與代碼功能解析

TCP 是一種面向連接的可靠傳輸協議,其核心特性體現在:

  • 連接導向:通信前必須通過 "三次握手" 建立連接
  • 可靠傳輸:通過序列號、確認應答、超時重傳等機制保證數據完整
  • 流量控制:通過滑動窗口機制避免接收方緩沖區溢出
  • 擁塞控制:根據網絡狀況動態調整發送速率

本次展示的代碼實現了 TCP 最基礎的單向通信模式:客戶端主動發起連接并發送一條字符串消息,服務器端接收消息后打印內容及客戶端地址信息。該代碼雖簡單,卻完整包含了 TCP 通信的核心流程,是理解復雜 TCP 應用的基礎。

二、代碼執行流程深度解析

1. 服務器端啟動與等待連接

服務器端的運行遵循 "初始化 - 等待 - 處理" 的邏輯:

  1. 端口注冊:通過new ServerSocket(8888)創建服務器端對象,同時向系統注冊 8888 端口,用于監聽客戶端連接請求
  2. 阻塞等待:serverSocket.accept()方法會進入阻塞狀態,直到有客戶端發起連接請求,此時返回一個Socket對象,建立與客戶端的專屬通信管道
  3. 流初始化:從Socket中獲取字節輸入流InputStream,并包裝為DataInputStream—— 這種包裝能直接讀取 Java 基本數據類型,簡化字符串傳輸流程
  4. 數據讀取:dis.readUTF()方法讀取客戶端發送的 UTF-8 編碼字符串,該方法會嚴格按照writeUTF()的編碼格式解析數據
  5. 資源釋放:讀取完成后關閉輸入流和Socket,釋放系統資源

2. 客戶端連接與數據發送

客戶端的執行流程體現了 TCP 的主動發起特性:

  1. 建立連接:new Socket("127.0.0.1", 8888)通過指定 IP 地址(本地回環地址)和端口號,向服務器端發起連接請求,底層會完成三次握手過程
  2. 輸出流準備:獲取Socket的字節輸出流OutputStream,并包裝為DataOutputStream,便于使用writeUTF()方法發送字符串
  3. 消息發送:dos.writeUTF()會先寫入字符串長度(2 字節),再寫入 UTF-8 編碼的字節序列,確保服務器端能準確解析
  4. 連接關閉:發送完成后關閉輸出流和Socket,觸發四次揮手過程終止連接

三、TCP 通信的關鍵特性驗證

通過代碼運行可直觀觀察 TCP 的核心特性:

  • 連接導向:若先啟動客戶端會拋出Connection refused異常,證明必須先建立連接才能通信
  • 順序傳輸:多次發送消息時(需修改代碼為循環),服務器端接收順序與發送順序完全一致
  • 可靠交付:在網絡不穩定環境下,TCP 會自動重傳丟失的數據包,確保服務器端最終能完整接收

代碼中socket.getRemoteSocketAddress()方法展示了 TCP 的雙向地址感知能力,該方法返回客戶端的 IP 地址和端口號(格式為/127.0.0.1:端口號),體現了 TCP 連接的端到端特性。

四、技術局限性與擴展方向

現有代碼的局限性

  1. 單向通信:僅支持客戶端向服務器端發送消息,無法實現雙向交互
  2. 單連接處理:服務器端處理完一個連接后即關閉,無法同時服務多個客戶端
  3. 無異常處理:未包含try-catch塊,網絡波動可能導致程序崩潰
  4. 資源釋放問題:直接關閉流可能導致資源釋放不徹底,建議使用 try-with-resources 語法

實用擴展方案

  1. 雙向通信:在客戶端添加輸入流、服務器端添加輸出流,實現消息互發
  2. 多客戶端支持:使用多線程技術,主線程負責接收連接,子線程處理具體通信
  3. 異常處理增強:添加try-catch-finally塊捕獲IOException,確保資源正確釋放
  4. 長連接保持:去除單次通信后關閉連接的邏輯,通過心跳機制維持長連接

五、TCP 通信的典型應用場景

盡管 TCP 存在連接建立延遲、開銷較大等特點,但其可靠性使其在以下場景中不可替代:

  • 文件傳輸:FTP、SFTP 等協議基于 TCP 實現,確保文件傳輸完整
  • 金融交易:銀行轉賬、支付系統等需保證交易指令準確無誤
  • 郵件服務:SMTP、IMAP 等郵件協議依賴 TCP 確保郵件不丟失
  • HTTP 通信:網頁瀏覽、API 調用等場景需要完整的內容傳輸

相比之下,視頻通話、實時游戲等對延遲敏感的場景更適合 UDP,開發者需根據業務特性選擇合適的傳輸協議。

總結

本文通過一段精簡的 Java 代碼,完整呈現了 TCP 單向通信的實現過程。從服務器端的端口監聽,到客戶端的連接發起,再到數據的編碼傳輸,每一步都體現了 TCP 協議的核心設計思想。

掌握這段代碼的原理后,開發者可逐步擴展出更復雜的 TCP 應用 —— 無論是多客戶端聊天系統,還是文件傳輸工具,其底層都離不開本文闡述的基礎流程。理解 TCP 的可靠性機制與代碼實現的對應關系,是構建穩定網絡應用的關鍵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92156.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92156.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker-compose啟動前后端分離項目(單機)

🌟docker-compose啟動前后端 📁準備文件 xzs-mysql.sql(數據庫腳本)xzs-3.9.0.jar(后端代碼)application-prod.yml(后端配置文件)entry.sh(后端啟動腳本)exam…

有關Mysql數據庫的總結

MySQL概念MySQL的理論知識概念數據庫就是用來存儲和管理數據的倉庫!數據庫分類層次型數據庫樹型結構,一個子記錄可以有一個父記錄,一個父記錄可以有多個子記錄,類似一個二叉樹,但是一個父節點可以不止兩個子節點&#…

復制docker根目錄遇到的權限問題

環境 ubuntu20.04, 普通用戶使用sudo權限。 需求 linux系統上,默認的docker跟目錄在/var/lib/docker目錄下,但是根分區太小。想要將docker根目錄挪到其它磁盤,防止以后鏡像和容器增加后磁盤滿了。 操作 先停止所有docker容器,然后…

git-子倉操作

為什么為什么要將代碼倉作為子模塊?有什么優勢?精確版本控制:父倉記錄子倉的commit哈希值,確保代碼版本固定,避免隱式升級導致的兼容性問題模塊化管理:將獨立倉庫作為子模塊嵌入父倉,實現代碼物…

代數——第5章——線性算子之應用(Michael Artin)

第 5 章 線性算子之應用 (Applications of Linear Operators) By relieving the brain from all unnecessary work, a good notation sets it free to concentrate on more advanced problems.( 通過減輕大腦所有不必要的工作,良好的符號可以讓大腦集中精力解決…

Pytorch02:深度學習基礎示例——貓狗識別

一、第三方庫介紹庫/模塊功能torch提供張量操作、自動求導、優化算法、神經網絡模塊等基礎設施。torchvision計算機視覺工具集,提供預訓練模型、數據集、圖像轉換等功能。datasets (torchvision)用于加載常見數據集(如 ImageNet、CIFAR-10、MNIST&#x…

spring簡單項目實戰

項目路徑 modelspackage com.qcby.demo1;import com.qcby.service.UserService; import com.qcby.service.UserServiceImpl;public class Dfactory {public UserService createUs(){System.out.println("實例化工廠的方式...");return new UserServiceImpl();} }pack…

ServBay for Windows 1.4.0 發布:新增MySQL、PostgreSQL等數據庫自定義配置

各位 Windows 平臺的開發者們, ServBay 始終致力于為您打造一個強大、高效且靈活的本地開發環境。距離上次更新僅過去短短一周,經過我們技術團隊的快速開發,我們正式推出了 ServBay for Windows 1.4.0 版本。 專業開發者不僅需要一個能用的環…

python網絡爬蟲小項目(爬取評論)超級簡單

python網絡爬蟲小項目(爬取評論)超級簡單 學習python網絡爬蟲的完整路徑: (第一章) python網絡爬蟲(第一章/共三章:網絡爬蟲庫、robots.txt規則(防止犯法)、查看獲取網頁源代碼)-…

本周大模型新動向:獎勵引導、多模態代理、鏈式思考推理

點擊藍字關注我們AI TIME歡迎每一位AI愛好者的加入!01Iterative Distillation for Reward-Guided Fine-Tuning of Diffusion Models in Biomolecular Design本文提出了一種用于生物分子設計中獎勵引導生成的擴散模型微調框架。擴散模型在建模復雜、高維數據分布方面…

JAVA+AI教程-第三天

我將由簡入繁,由零基礎到詳細跟大家一起學習java---------------------------------------------------------------------01、程序流程控制:今日課程介紹02、程序流程控制:if分支結構if分支有三種形式,執行順序就是先執行if&…

自定義命令行解釋器shell

目錄 一、模塊框架圖 二、實現目標 三、實現原理 四、全局變量 五、環境變量函數 六、初始化環境變量表函數 七、輸出命令行提示符模塊 八、提取命令輸入模塊 九、填充命令行參數表模塊 十、檢測并處理內建命令模塊 十一、執行命令模塊 十二、源碼 一、模塊框架圖…

uniapp使用uni-ui怎么修改默認的css樣式比如多選框及樣式覆蓋小程序/安卓/ios兼容問題

修改 uni-ui 多選框 (uni-data-checkbox) 的默認樣式 在 uniapp 中使用 uni-ui 的 uni-data-checkbox 組件時,可以通過以下幾種方式修改其默認樣式: 方法一:使用深度選擇器格式一:在頁面的 style 部分使用深度選擇器 >>>…

《Linux 環境下 Nginx 多站點綜合實踐:域名解析、訪問控制與 HTTPS 加密部署》?

綜合練習:請給openlab搭建web網站,網站需求: 1.基于域名www.openlab.com可以訪問網站內容為 welcome to openlab!!, 2.給該公司創建三個子界面分別顯示學生信息,教學資料和繳費網站,基于www.openlab.com/student 網站訪…

網絡基礎1-11綜合實驗(eNSP):vlan/DHCP/Web/HTTP/動態PAT/靜態NAT

注:在華為模擬器(eNSP)上做的實驗其中,在內網實驗:Vlan/DHCP/VWeb/HTTP,在外網實驗:動態PAT/靜態NAT一、拓撲結構1. 核心設備與連接設備接口連接對象VLAN/IP角色LSW2/LSW3Ethernet 0/0/1-2PC1/P…

Mac上安裝Claude Code的步驟

以下是基于現有信息的簡明安裝指南,適用于macOS系統。請按照以下步驟操作: 前提條件 操作系統:macOS 10.15或更高版本。Node.js和npm:Claude Code基于Node.js,需安裝Node.js 18和npm。請檢查是否已安裝: …

MybatisPlus-15.擴展功能-邏輯刪除

一.邏輯刪除配置邏輯刪除的字段時,logic-delete-field字段配置的是邏輯刪除的實體字段名。字段類型可以是boolean和integer。在java中默認是boolean類型。邏輯已刪除值默認為1,而邏輯未刪除值默認為0。當是1時代表已刪除(1在數據庫表中為true&#xff0c…

IDEA 同時修改某個區域內所有相同變量名

在 IntelliJ IDEA 中,同時修改某個區域內所有 相同變量名 的快捷鍵是: ? Shift F6(重命名變量) 但這個快捷鍵默認是 全局重命名,如果你想 僅修改某個方法或代碼塊內的變量名,可以這樣做:&…

Telink BLE 低功耗學習

低功耗管理(Low Power Management)也可以稱為功耗管理(Power Management),本?檔中會簡稱為PM。Telink低功耗解惑我查閱多連接SDK開發手冊時,低功耗管理章節看了兩三遍也沒太明白,有以下幾個問題…

設備管理系統(MMS)如何在工廠MOM功能設計和系統落地

一、核心系統功能模塊設備管理系統圍繞設備全生命周期管理設計,涵蓋基礎數據管理、設備運維全流程管控及統計分析功能,具體如下:基礎數據管理設備與備件臺賬:包含設備臺賬(設備編號、識別碼、型號、生產日期等&#xf…