Java網絡通信:UDP和TCP

一、UDP特點

  • 無連接不可靠:通信雙方不事先建立連接,直接發送數據。
  • 數據封裝:將數據封裝在64KB的數據包中,包含接收端的IP和端口。
  • UDP通信模型
    • 模型比喻:以拋韭菜為例,發送端像拋韭菜的人,接收端像接韭菜的人,數據如韭菜,數據包如韭菜盤子。
    • 模型作用:幫助理解UDP通信過程,后續代碼編寫將嚴格按照此模型進行。

二、 UDP客戶端代碼實現

  • 創建發送端對象:使用DatagramSocket類創建,系統會默認分配端口。
  • 創建數據包對象:使用DatagramPacket類,封裝要發送的數據,需將數據轉成字節數組,指定發送長度、目的地IP和端口。
  • 發送數據包:調用DatagramSocket對象的send方法。
  • UDP服務端代碼實現
    • 創建接收端對象:使用DatagramSocket類,需注冊端口,與客戶端指定的端口匹配。
    • 創建數據包對象:使用DatagramPacket類,準備字節數組接收數據,大小最好設置為64KB。
    • 接收數據:調用DatagramSocket對象的receive方法,將數據封裝到數據包對象的字節數組中。
    • 處理數據:獲取收到的數據長度,可通過數據包對象獲取對方的IP和端口。
  • 代碼測試與注意事項
    • 啟動順序:先啟動服務端,再啟動客戶端。
    • 資源關閉:客戶端發完數據后應關閉通信管道,服務端不應關閉。
  • UDP多發多收實現
    • 客戶端改造:使用while死循環,讓用戶不斷輸入數據,封裝成數據包發送,輸入exit退出。
    • 服務端改造:使用while死循環,不斷用數據包接收數據。
  • 服務端多客戶端接收原理
    • 接收原理:服務端只負責接收流向本機和指定端口的數據包,不管數據來自哪個客戶端,所以可以同時接收多個客戶端的消息。
    • 多開客戶端:在IDE中配置允許多開實例,可同時啟動多個客戶端。

三、TCP通信基礎

  • 特點回顧 :TCP通信是面向連接的可靠通信,采用三次握手建立全雙工可靠連接,能實現端到端通信,服務端確認接收后數據才被認為發送成功。
  • 實現方式 :在Java中使用Socket類實現TCP通信,基于IO流進行數據傳輸。
  • 通信模型 :通信分客戶端和服務端,需建立Socket端到端的通信管道,通過字節輸入流和輸出流在管道中收發數據。
  • 客戶端開發
    • 創建管道 :創建Socket對象請求與服務端連接,需填寫服務器IP和端口,如使用本地IP可填127.0.0.1,端口可設為9999。
    • 發送消息 :從Socket管道獲取字節輸出流,可將其包裝成打印流、緩沖字節輸入流或特殊數據流(DataOutputStream)發送數據,注意流的對應匹配。
    • 資源釋放 :實際開發中一般用戶點退出時才關閉管道,一發一收場景可關閉。
  • 服務端開發
    • 創建對象 :使用ServerSocket類創建對象并注冊端口,等待客戶端連接,調用accept方法返回服務端的Socket對象。
    • 接收數據 :從Socket管道獲取字節輸入流,包裝成特殊數據輸入流(DataInputStream)接收客戶端數據,先接收整數,再接收消息。
    • 獲取信息 :可通過Socket管道獲取客戶端的IP和端口信息。

四、 測試與運行

  • 啟動順序 :先啟動服務端,服務端在accept方法處阻塞等待客戶端連接,客戶端啟動后雙方建立通信管道。
  • 速度差異 :服務端和客戶端執行速度快慢不影響數據接收,數據會緩存到管道中,確保對方收到。
  • 多發多收實現
    • 客戶端改造 :使用死循環讓用戶反復輸入消息,通過Scanner獲取用戶輸入,發exit時關閉管道并退出循環。
    • 服務端改造 :將接收消息的邏輯放入死循環,只接收文本消息,服務端不能關閉管道。
  • 多客戶端支持
    • 單線程問題 :當前服務端單線程只能處理一個客戶端消息,加死循環也無法解決。
    • 多線程引入 :主線程負責接收客戶端連接,每接到一個管道交給獨立子線程處理消息,定義線程類(如ServerReader)重寫run方法讀取管道消息。
    • 上下線追蹤 :服務端可通過接收管道知道客戶端上線,客戶端異常退出或關閉程序時服務端捕獲異常追蹤下線邏輯,可獲取客戶端IP。

五、BS架構原理

  • 架構特點 :CS架構需開發客戶端和服務端,BS架構客戶端為瀏覽器無需開發,服務端需開發響應網頁。
  • 請求與響應 :瀏覽器使用HTTP協議通過IP和端口請求服務端,服務端響應網頁數據需遵循HTTP協議規定的格式,包括協議版本、頭部字段、空行等。
  • 代碼開發 :復制之前的服務端代碼進行修改,端口設為8080方便瀏覽器識別,使用打印流響應網頁數據,響應完關閉管道。
  • 線程池優化
    • 優化原因 :每次請求開一個線程處理網站請求不合適,線程工作時間短,創建和銷毀大量線程開銷大,線程池適合處理網站請求。
    • 實現方法 :將Socket管道包裝成任務對象(實現Runnable接口)交給線程池處理,創建線程池時設置核心線程數、最大線程數、任務隊列等參數。

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

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

相關文章

Java行為型模式(狀態模式)實現方式與測試方法

一、狀態模式實現方式 核心結構 狀態接口(State):定義狀態相關的行為方法。具體狀態類(ConcreteState):實現狀態接口,封裝特定狀態下的邏輯。上下文類(Context)&#xff…

MISRA C-2012準則之標準C環境準則

目錄 1.標準C環境準則 錯誤示例1:未定義行為(整數溢出) 錯誤示例2:未指定行為(函數調用順序) 錯誤示例3:語言擴展(GCC內置函數) 錯誤示例4:關鍵未指定行…

26、鴻蒙Harmony Next開發:ArkTS并發(Promise和async/await和多線程并發TaskPool和Worker的使用)

目錄 異步并發 (Promise和async/await) Promise async/await 多線程并發 多線程并發模型 內存共享模型 Actor模型 TaskPool TaskPool運作機制 TaskPool注意事項 Concurrent裝飾器 裝飾器說明 裝飾器使用示例 TaskPool擴縮容機制 擴容機制 縮容機制 Worker Wo…

[IRF/Stack]華為/新華三交換機堆疊配置

堆疊的三大優勢 提高資源利用率&#xff0c;獲得更高的轉發性能、鏈路帶寬降低網絡規劃的復雜度、方便網絡的管理降低故障對業務的影響時間 堆疊的兩個需求 設備型號必須統一系統版本必須統一 華三堆疊案例&#xff1a;#### S6850_1 <H3C>sy [H3C]undo in en [H3C]sy SW…

融智興科技: RFID超高頻洗滌標簽解析

在紡織品租賃與管理領域&#xff0c;布草、工服、醫護織物等物品的流轉追蹤一直是運營管理的核心挑戰。傳統管理方式依賴人工計數與條碼掃描&#xff0c;存在效率低下、差錯率高、損耗嚴重等問題&#xff0c;尤其在工業洗滌環境下&#xff0c;紙質標簽易損壞、識別率低。融智興…

從平面到時空:地圖故事的時空敘事與沉浸式閱讀

朋友們&#xff0c;在工作中你是否也遇到過這些令人頭疼的挑戰&#xff1f;當項目匯報時總覺得表達不夠精彩&#xff0c;方案講解時聽眾總是一頭霧水&#xff0c;制作應急預案時更是無從下手&#xff1f;別擔心&#xff01;今天我要向大家介紹一個超級實用的解決方案——地圖故…

自動控制原理知識地圖:舵輪、路徑與導航圖

掌握自控原理的關鍵&#xff0c;在于看清那棵枝繁葉茂的“知識樹”——從根部的數學模型&#xff0c;到主干的分析方法&#xff0c;直至頂端的系統設計。作為一名自動化專業學生&#xff0c;你是否曾在深夜里面對勞斯判據和奈奎斯特圖感到深深的恐懼&#xff1f;作為初入行的工…

Flutter在Android studio運行出現Error: Entrypoint is not a Dart file

Flutter在Android studio運行出現Error: Entrypoint is not a Dart file

NE綜合實驗2:RIP 與 OSPF 動態路由精細配置及ACL訪問控制列表 電腦

NE綜合實驗2&#xff1a;RIP 與 OSPF 動態路由精細配置及ACL訪問控制列表 實驗拓撲圖實驗需求 1.按照圖示配置IP地址 2.按照圖示區域劃分配置對應的動態路由協議 3.在R7上配置dhcp服務器&#xff0c;能夠讓pc可以獲取IP地址 4.將所有環回?宣告進ospf中&#xff0c;將環回?7宣…

Kafka 控制器(Controller)詳解:架構、原理與實戰

目錄Kafka 控制器&#xff08;Controller&#xff09;詳解&#xff1a;架構、原理與實戰一、控制器的核心職責1. 元數據管理2. 分區狀態機3. 故障恢復4. 集群操作協調二、傳統 ZooKeeper 模式下的控制器1. 控制器選舉機制2. 控制器與 ZooKeeper 的交互3. 潛在問題三、KRaft 模式…

【C++基礎】#define vs constexpr:C++ 編譯期常量的雙雄對決(面試高頻考點 + 真題解析)

?在 C++ 面試中,#define與constexpr的對比堪稱 “元老級” 考點 —— 據統計,在 2023-2024 年的 C++ 工程師面試中,該知識點的出現頻率高達 72%,尤其是在字節跳動、騰訊、華為等企業的校招 / 社招中,幾乎是必問內容。? 這兩個語法元素都與 “編譯期常量” 相關,但背后卻…

k8s環境使用Operator部署Seaweedfs集群(上)

作者&#xff1a;閆乾苓 文章目錄前言4.1 前置條件4.2 部署seaweedfs-operator4.3 準備operator鏡像4.4 使用operator部署Seaweedfs集群4.4.1 部署StorageClass4.4.2 使用StorageClass預先創建PV前言 SeaweedFS Operator是一個Kubernetes Operator&#xff0c;用于自動化部署和…

Git CLI高危任意文件寫入漏洞(CVE-2025-48384)PoC已公開

Git CLI&#xff08;命令行界面&#xff09;中存在一個高危漏洞&#xff0c;攻擊者可利用該漏洞在Linux和macOS系統上實現任意文件寫入。目前該漏洞的概念驗證&#xff08;PoC&#xff09;利用代碼已公開。該漏洞編號為CVE-2025-48384&#xff0c;CVSS嚴重性評分為8.1分&#x…

前端開發中關于表單內容的使用和基礎知識

在前邊&#xff0c;我們已經寫過Web前端開發&#xff0c;Web前端開發&#xff0c;萬字詳細博文帶你HTML&#xff0c;CSS快速入門&#xff08;上篇&#xff09;和Web前端開發&#xff0c;一文帶你HTML&#xff0c;CSS快速入門&#xff08;下篇&#xff09;&#xff0c;使用近兩萬…

linux 安裝mysql保姆教程

安裝包下載地址: MySQL :: Download MySQL Community Server (Archived Versions) 解壓到安裝包&#xff1a; tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz 創建Mysql用戶組和用戶 groupadd mysql useradd -r -g mysql mysql 編譯安裝并初始化 進入/home/mysql/m…

Android系統的問題分析筆記 - Android上的調試方式 bugreport

在Android開發和系統調試中&#xff0c;bugreport&#xff08;錯誤報告&#xff09; 是一份包含設備詳細系統狀態、運行日志及應用行為的綜合報告&#xff0c;是定位和診斷App崩潰、系統異常、性能問題等的核心工具。無論是開發者排查用戶反饋的問題&#xff0c;還是設備廠商調…

GESP2025年6月認證C++四級( 第三部分編程題(2)排序)

參考程序&#xff1a;#include <cstdio> #include <algorithm> #include <vector> #include <iostream> using namespace std;int main() {int n, ans 0;// 讀取學生人數scanf("%d", &n);// 用 vector 存儲每個學生的身高和體重&#x…

SQL155 大小寫混亂時的篩選統計

SQL155 大小寫混亂時的篩選統計 題目理解 假設我們有一個考試系統數據庫&#xff0c;里面有&#xff1a; exam_record表&#xff1a;記錄學生考試作答情況examination_info表&#xff1a;記錄考試信息&#xff0c;包括每個考試的類別標簽(tag) ?問題描述?&#xff1a; 有…

無人機圖像中的小目標檢測新利器:深入解析 LAM-YOLO 模型

【導讀】 隨著無人機技術的發展&#xff0c;從交通監控到農業測繪&#xff0c;各類任務中對“空中視角下的小目標檢測”需求激增。然而&#xff0c;由于無人機拍攝視角多變、目標尺寸微小、環境光照復雜等因素&#xff0c;傳統檢測模型常常出現“漏檢”“誤檢”問題。 LAM-YO…

Rust 基礎大綱

Rust 基礎大綱1.Summary安裝教材2 Rust 源1.Summary 安裝 https://www.rust-lang.org/zh-CN/tools/install curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安裝完成后&#xff0c;驗證是否成功 rustc -V cargo -V# 創建項目 cargo new my_project # 編譯項…