Java 實現 UDP 多發多收通信

在網絡通信領域,UDP(用戶數據報協議)以其無連接、高效率的特點,在實時通信場景中占據重要地位。本文將結合一段實現 UDP 多發多收的 Java 代碼,詳細解析其實現邏輯,幫助開發者深入理解 UDP 通信的底層邏輯與實現方式。

以下為實現 UDP 多發多收的 Java 代碼,包含客戶端和服務器端兩部分:

客戶端(Client)代碼:

package com.practical.agreement.utp.utp_2;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/*
@description:UDP通信多發多收
@ClassName Client
@author chen
@create 2025-07-18 14:50
@Version 1.0
*/
public class Client
{public static void main(String[] args) throws Exception{System.out.println("----客戶端啟動----");// 1、創建客戶端對象DatagramSocket socket = new DatagramSocket();Scanner sc = new Scanner(System.in);while (true){System.out.println("請說:");String msg = sc.nextLine();if("exit".equals(msg)){System.out.println("歡迎下次光臨!退出成功!");socket.close(); // 釋放資源break; // 跳出死循環}byte[] bytes = msg.getBytes();DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),  8888);// 3、開始正式發送這個數據包的數據出去了socket.send(packet);}}
}

服務器端(Server)代碼:

package com.practical.agreement.utp.utp_2;import java.net.DatagramPacket;
import java.net.DatagramSocket;/*
@description:
@ClassName Server
@author chen
@create 2025-07-18 14:50
@Version 1.0
*/
public class Server
{public static void main(String[] args) throws Exception{System.out.println("----服務端啟動----");// 1、創建一個服務端對象 注冊端口DatagramSocket socket = new DatagramSocket(8888);// 2、創建一個數據包對象,用于接收數據的byte[] buffer = new byte[1024 * 64]; // 64KB.DatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true){// 3、開始正式使用數據包來接收客戶端發來的數據socket.receive(packet);// 4、從字節數組中,把接收到的數據直接打印出來// 接收多少就倒出多少// 獲取本次數據包接收了多少數據。int len = packet.getLength();String rs = new String(buffer, 0 , len);System.out.println(rs);System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());System.out.println("--------------------------------------");}}
}

一、UDP 協議與多發多收功能概述

UDP 是一種無連接的傳輸層協議,它不保證數據傳輸的可靠性,也不提供流量控制和擁塞控制機制。但正因為省去了連接建立、確認重傳等過程,UDP 的傳輸效率遠高于 TCP,非常適合對實時性要求高、可容忍少量數據丟失的場景,如即時通訊、語音通話、視頻流傳輸等。

上述代碼實現了 UDP 協議下的 “多發多收” 功能 —— 客戶端可以持續發送多條消息,服務器端則能實時接收并處理這些消息,直到客戶端主動終止連接。這種通信模式充分體現了 UDP 的實時交互能力,也是網絡編程中的典型應用場景。

二、核心代碼解析

1. 客戶端(Client)實現

客戶端代碼的核心功能是持續讀取用戶輸入并向服務器發送數據報,直到用戶輸入 “exit” 為止。其關鍵實現步驟如下:

  • 創建 UDP 套接字:通過DatagramSocket類實例化客戶端套接字,無需指定端口(由系統自動分配)。
  • 循環發送機制:使用while(true)構建無限循環,支持持續輸入和發送消息。
  • 用戶交互邏輯:通過Scanner讀取控制臺輸入,若輸入 “exit” 則關閉套接字并終止循環。
  • 數據包構建:將輸入的字符串轉換為字節數組,通過DatagramPacket封裝數據,指定目標服務器的 IP 地址(本地主機)和端口(8888)。
  • 數據發送:調用socket.send(packet)發送數據包。

代碼中InetAddress.getLocalHost()獲取本地 IP 地址,確保客戶端與服務器在同一主機上通信;DatagramPacket的構造參數明確了數據內容、長度、目標地址和端口,是 UDP 通信的核心數據載體。

2. 服務器端(Server)實現

服務器端代碼的核心功能是監聽指定端口,持續接收客戶端發送的數據包并解析信息。其關鍵實現步驟如下:

  • 綁定端口:通過DatagramSocket(8888)創建服務器套接字并綁定 8888 端口,確保客戶端能準確定向發送數據。
  • 緩沖區設置:定義 64KB 字節數組作為緩沖區(byte[] buffer = new byte[1024 * 64]),用于存儲接收的數據。
  • 數據包接收:通過DatagramPacket實例接收數據,socket.receive(packet)為阻塞方法,會一直等待客戶端數據。
  • 數據解析:通過packet.getLength()獲取實際接收的數據長度,轉換為字符串后輸出;同時通過packet.getAddress()和packet.getPort()獲取客戶端的 IP 地址和端口,實現雙向通信追溯。

服務器端同樣采用無限循環,確保能持續接收多條消息,體現 “多收” 特性。

三、運行流程與交互邏輯

  1. 啟動順序:需先啟動服務器端(綁定端口并進入監聽狀態),再啟動客戶端(避免連接失敗)。
  1. 消息交互:客戶端輸入消息后,數據以 UDP 數據報形式發送到服務器端 8888 端口;服務器端實時接收并打印消息內容、客戶端 IP 和端口。
  1. 終止機制:客戶端輸入 “exit” 后,關閉套接字并退出循環;服務器端需手動終止(可優化為支持優雅關閉)。

該流程清晰展現了 UDP “無連接” 特性:客戶端無需與服務器建立持久連接,每次發送均為獨立數據報,服務器端通過數據包中的源信息識別發送方。

四、技術特點與適用場景

優勢

  • 實時性強:無連接開銷,數據傳輸延遲低,適合實時聊天、游戲數據同步等場景。
  • 實現簡單:無需處理連接建立、斷開及重傳機制,代碼邏輯簡潔。
  • 資源占用低:服務器端可同時接收多個客戶端數據(需擴展多線程),適合高并發場景。

局限性

  • 不可靠性:數據可能丟失、重復或亂序,需在應用層實現校驗機制(如添加序號)。
  • 緩沖區限制:固定緩沖區大小可能導致大數據包截斷,需根據業務調整容量。

典型應用

  • 即時通訊工具(如局域網聊天軟件)
  • 流媒體傳輸(音頻、視頻片段)
  • 物聯網設備數據上報(傳感器實時數據)

五、總結與擴展

本文通過 Java 代碼實例,直觀展示了 UDP 多發多收通信的實現方式。核心在于利用DatagramSocket和DatagramPacket類處理數據的發送與接收,通過循環結構實現 “多發多收” 功能。

實際開發中,可基于此代碼進行擴展:

  • 增加異常處理機制(如try-catch塊),提升程序健壯性。
  • 實現服務器端多線程處理,支持同時接收多個客戶端消息。
  • 添加數據校驗和重傳邏輯,彌補 UDP 可靠性不足的缺陷。

掌握 UDP 通信原理與實現,對于理解網絡協議分層模型及構建高性能網絡應用具有重要意義。

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

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

相關文章

Java學習第六十二部分——Git

目錄 一、關鍵概述 二、核心概念 三、常用命令 四、優勢因素 五、應用方案 六、使用建議 一、關鍵概述 提問:Git 是什么? 回答:一句話,分布式版本控制系統(DVCS),用來跟蹤文件&#…

CDN和DNS 在分布式系統中的作用

一、DNS:域名系統(Domain Name System) 1. 核心功能 DNS是互聯網的“地址簿”,負責將人類易記的域名(如www.baidu.com)解析為計算機可識別的IP地址(如180.101.50.242)。沒有DNS&…

uniapp用webview導入本地網頁,ios端打開頁面空白問題

目前還沒解決,DCloud官方也說不行 IOS下webview加載本地網頁時,無法加載資源 - DCloud問答

軟考 系統架構設計師系列知識點之面向服務架構設計理論與實踐(8)

接前一篇文章:軟考 系統架構設計師系列知識點之面向服務架構設計理論與實踐(7) 所屬章節: 第15章. 面向服務架構設計理論與實踐 第3節 SOA的參考架構 15.3 SOA的參考架構 IBM的Websphere業務集成參考架構(如圖15-2所示,以下簡稱參考架構)是典型的以服務為中心的企業集…

基于 Docker 及 Kubernetes 部署 vLLM:開啟機器學習模型服務的新篇章

在當今數字化浪潮中,機器學習模型的高效部署與管理成為眾多開發者和企業關注的焦點。vLLM 作為一款性能卓越的大型語言模型推理引擎,其在 Docker 及 Kubernetes 上的部署方式如何呢?本文將深入探討如何在 Docker 及 Kubernetes 集群中部署 vL…

工業互聯網六大安全挑戰的密碼“解法”

目錄 工業互聯網密碼技術應用Q&A Q1:設備身份認證與接入控制 Q2:通信數據加密與完整性保護 Q3:遠程安全訪問 Q4:平臺與數據安全 Q5:軟件與固件安全 Q6:日志審計與抗抵賴 首傳信安-解決方案 總…

基于springboot的在線問卷調查系統的設計與實現(源碼+論文)

一、開發環境 1 Java語言 Java語言是當今為止依然在編程語言行業具有生命力的常青樹之一。Java語言最原始的誕生,不僅僅是創造者感覺C語言在編程上面很麻煩,如果只是專注于業務邏輯的處理,會導致忽略了各種指針以及垃圾回收這些操作&#x…

民法學學習筆記(個人向) Part.1

民法學學習筆記(個人向) Part.1有關民法條文背后的事理、人心、經濟社會基礎;民法的結構民法學習的特色就是先學最難的民法總論,再學較難的物權法、合同法等,最后再學習最簡單的婚姻、繼承、侵權部分。這是一個由難到易的過程,尤為…

ElasticSearch Doc Values和Fielddata詳解

一、Doc Values介紹倒排索引在搜索包含指定 term 的文檔時效率極高,但在執行相反操作,比如查詢一個文檔中包含哪些 term,以及進行排序、聚合等與指定字段相關的操作時,表現就很差了,這時候就需要用到 Doc Values。倒排…

【C語言】解決VScode中文亂碼問題

文章目錄【C語言】解決VScode中文亂碼問題彈出無法寫入用戶設置的處理方法彈出無法在只讀編輯器編輯的問題處理方法【C語言】解決VScode中文亂碼問題 💬歡迎交流:在學習過程中如果你有任何疑問或想法,歡迎在評論區留言,我們可以共…

MySQL筆記4

一、范式1.概念與意義范式(Normal Form)是數據庫設計需遵循的規范,解決“設計隨意導致后期重構困難”問題。主流有 三大范式(1NF、2NF、3NF),還有進階的 BCNF、4NF、5NF 等,范式間是遞進依賴&am…

切比雪夫不等式的理解以及推導【超詳細筆記】

文章目錄參考教程一、意義1. 正態分布的 3σ 法則2. 不等式的含義3. 不等式的意義二、不等式的證明1. 馬爾科夫不等式馬爾可夫不等式證明(YYY 為非負隨機變量 )2. 切比雪夫不等式推導參考教程 一個視頻,徹底理解切比雪夫不等式 一、意義 1. 正態分布的…

Spring Boot Jackson 序列化常用配置詳解

一、引言在當今的 Web 開發領域,JSON(JavaScript Object Notation)已然成為數據交換的中流砥柱。無論是前后端分離架構下前后端之間的數據交互,還是微服務架構里各個微服務之間的通信,JSON 都承擔著至關重要的角色 。它…

Jetpack ViewModel LiveData:現代Android架構組件的核心力量

引言在Android應用開發中,數據管理和界面更新一直是開發者面臨的重大挑戰。傳統的開發方式常常導致Activity和Fragment變得臃腫,難以維護,且無法優雅地處理配置變更(如屏幕旋轉)。Jetpack中的ViewModel和LiveData組件正…

Python數據分析案例79——基于征信數據開發信貸風控模型

背景 雖然模型基本都是表格數據那一套了,算法都沒什么新鮮點,但是本次數據還是很值得寫個案例的,有征信數據,各種,個人,機構,逾期匯總..... 這么多特征來做機器學習模型應該還不錯。本次帶來&…

板凳-------Mysql cookbook學習 (十二--------3_2)

3.3鏈接表 結構 P79頁 用一個類圖來表示EmployeeNode類的結構,展示其屬性和關系: plaintext ----------------------------------------- | EmployeeNode | ----------------------------------------- | - emp_no: int …

深度學習圖像預處理:統一輸入圖像尺寸方案

在實際訓練中,最常見也最簡單的做法,就是在送入網絡前把所有圖片「變形」到同一個分辨率(比如 256256 或 224224),或者先裁剪/填充成同樣大小。具體而言,可以分成以下幾類方案:一、圖…

pytest-log

問題1:我們在運行測試用例的時候如何記錄測試的log,如何使用?問題2:我寫的函數,為了方便log記錄,但是在pytest運行時,會兼容pytest且不會重復記錄,怎么解決?1、pytest有內…

在安卓源碼中添加自定義jar包給源碼中某些模塊使用

一、具體步驟 1. 準備目錄與 Jar 包 在vendor下 創建新的模塊目錄,放入demo.jar 包: demojar/ # 模塊目錄 ├── Android.bp # 編譯配置文件 └── demo.jar 2. 編寫 Android.bp 配置 Android.bp 示例配置: java_import {…

buntu 22.04 上離線安裝Docker 25.0.5(二)

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址:星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了,可以私信我獲取最新兌換碼!&a…