Java網絡編程:UDP通信篇


目錄

UDP協議

Java中的UDP通信

DatagramSocket

DatagramPacket

UDP客戶端-服務端代碼實現


UDP協議

對于UDP協議,這里簡單做一下介紹:

在TCP/IP協議簇中,用戶數據報協議(UDP)是傳輸層的一個主要協議之一,它與傳輸控制協議(TCP)一起構成了互聯網的基礎。UDP具有以下幾個主要特點:

  1. 無連接:UDP是一個無連接的協議,這意味著在通信之前不需要建立連接。每個數據包獨立傳輸,沒有握手過程。這使得UDP的傳輸延遲較低,適合需要快速傳輸數據的應用場景。
  2. 不可靠傳輸:UDP不保證數據的可靠傳輸。數據包可能會丟失、重復或亂序到達。協議本身不提供錯誤檢測和重傳機制。如果需要可靠性,必須在應用層實現。
  3. 面向報文:UDP是面向報文的協議。發送方將數據分成獨立的報文,每個報文包含完整的消息。接收方按報文接收數據,報文的邊界在接收時保持不變。
  4. 低開銷:由于UDP沒有連接建立、維護和終止的開銷,也沒有復雜的錯誤控制和流量控制機制,其報頭信息較少,僅包含源端口、目標端口、長度和校驗和。這使得UDP的開銷非常低,適合需要高效傳輸的應用。
  5. 支持廣播和多播:UDP支持廣播和多播,這意味著可以將數據包發送到一個或多個網絡中的所有主機。這在某些網絡應用中非常有用,例如視頻流和在線游戲。
  6. 實時性好:由于沒有連接建立和維護的開銷,加上較低的協議處理時間,UDP適合實時性要求高的應用,如視頻會議、語音通信和在線游戲。
  7. 簡單性:UDP協議相對簡單,實現和使用都比較方便。應用程序可以直接在UDP之上構建,并根據需要添加錯誤處理、重傳等機制。

適用場景

  • 實時應用:如視頻流、語音通信、在線游戲等,要求低延遲和實時性,數據丟失影響較小。
  • 簡單查詢服務:如DNS查詢,發送一個請求并期望快速響應,偶爾的丟包可以通過重試解決。
  • 廣播和多播:如網絡發現、服務公告等,需要將消息發送給多個主機。

Java中的UDP通信

市面上大部分Java應用存在著大量的通信交流的需求,那了解了UDP協議的相關信息和使用場景后,對于Java程序我們該如何來實現通信呢?

在Java中實現UDP通信涉及兩個主要類:DatagramSocketDatagramPacket

DatagramSocket

DatagramSocket類用于創建和管理UDP套接字。它負責發送和接收數據包,并提供了基本的網絡通信功能。

主要功能包括:

  • 綁定到特定的IP地址和端口。
  • 發送和接收DatagramPacket
  • 管理網絡連接的基本設置(例如超時、緩沖區大小)。

主要方法

  • DatagramSocket(): 創建一個綁定到任意可用端口的套接字。
  • DatagramSocket(int port): 創建一個綁定到指定端口的套接字。
  • DatagramSocket(int port, InetAddress laddr): 創建一個綁定到指定端口和本地地址的套接字。
  • send(DatagramPacket p): 發送數據包。
  • receive(DatagramPacket p): 接收數據包。
  • close(): 關閉套接字。

更多詳細的方法和參數講解可以查看oracle官方的API文檔:

DatagramSocket (Java SE 17 & JDK 17) (oracle.com)

這里是中文版本的:

DatagramSocket - Java17中文文檔 - API參考文檔 - 全棧行動派 (qzxdp.cn)

DatagramPacket

DatagramPacket類用于表示一個數據包。它包含發送或接收的數據,以及目標或來源的IP地址和端口。

主要功能包括:

  • 封裝數據(字節數組)。
  • 存儲發送或接收數據包的目標或來源信息(IP地址和端口)。

主要方法

  • DatagramPacket(byte[] buf, int length): 創建用于接收數據的數據包。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port): 創建用于發送數據的數據包。
  • getData(): 獲取數據包中的數據。
  • getLength(): 獲取數據包中數據的長度。
  • getAddress(): 獲取數據包的目標或來源地址。
  • getPort(): 獲取數據包的目標或來源端口。
  • setData(byte[] buf): 設置數據包中的數據。
  • setLength(int length): 設置數據包中數據的長度。
  • setAddress(InetAddress address): 設置數據包的目標地址。
  • setPort(int port): 設置數據包的目標端口。

筆者這里還是將官方的API文檔和對應的中文文檔給出:

DatagramPacket (Java SE 17 & JDK 17) (oracle.com)

DatagramPacket - Java17中文文檔 - API參考文檔 - 全棧行動派 (qzxdp.cn)

DatagramSocket主要通過DatagramPacket來傳輸和接收數據。在UDP通信中,DatagramPacket用于封裝數據和相關信息(如目標地址和端口),而DatagramSocket則用于實際的發送和接收操作。

舉個點外賣的例子來說明,假如今天是瘋狂星期四,小李想要點個肯德基的芝士漢堡,DatagramSocket就相對于是肯德基的大門以及小李家的大門,DatagramPacket就相對于是外賣小哥,小李點的漢堡等食品就相對于是要傳輸的數據,當肯德基做好漢堡后,外賣小哥通過肯德基的大門的地址信息(DatagramSocket)拿到漢堡(DatagramPacket),然后由外賣小哥將食品包裝好,到小李家樓下后通過小李家的門牌號的信息(DatagramSocket)找到小李,并且將漢堡交付給小李。

另外,這里對套接字需要簡單的做一個解釋:

套接字(Socket)是網絡通信的基本組件,它提供了一種機制,使得計算機能夠通過網絡進行數據傳輸。套接字是一個抽象概念,用于表示網絡通信的一個端點。無論是TCP還是UDP通信,套接字都是必不可少的。


UDP客戶端-服務端代碼實現

服務器端和客戶端在代碼實現方面是非常簡單的,在前文中有說到:UDP不是面向連接的而且協議本身就很簡單。因此在實現方面需要做的功能也很少,大致可以分為以下幾步:

  • 創建套接字(DatagramSocket)。
  • 發送(Send)和接收(Receive)數據包(DatagramPacket)。
  • 關閉(Close)套接字。

?還是拿剛才買漢堡的例子,我們就可以這樣來實現:

UDP客戶端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;public class UDPClient {public static void main(String[] args) throws IOException {// 要發送的信息String messg = "我是小李,我想點一個芝士漢堡";// 建立SocketDatagramSocket socket = new DatagramSocket();// 建立收發容器byte[] sendData;byte[] receiveData = new byte[1024];// 發送數據包sendData = messg.getBytes();InetAddress serverAddress = InetAddress.getByName("localhost");DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9999);socket.send(sendPacket);// 接收數據包DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received from Server: " + receivedMessage);// 關閉套接字socket.close();}
}

UDP服務端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;public class UDPServer {public static void main(String[] args) throws IOException {// 要發送的信息String messg = "這里是肯德基,您的芝士漢堡已經制作完畢,祝您用餐愉快";// 建立SocketDatagramSocket socket = new DatagramSocket(9999);try {// 建立收發容器byte[] sendData;byte[] receiveData = new byte[1024];// 接收數據包DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received from Client: " + receivedMessage);// 發送數據包sendData = messg.getBytes();InetAddress clientAddress = receivePacket.getAddress();int clientPort = receivePacket.getPort();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);socket.send(sendPacket);} finally {// 關閉套接字if (socket != null && !socket.isClosed()) {socket.close();}}}
}

上述只是一個非常簡單的例子,實現了UDP通信中的一發一收的功能。要實現更豐富的功能也只需要稍微改一改就行,比如加上while循環就可以使得通信可以不間斷,一直發消息一直收消息,也可以加上文件讀寫的操作使得用戶的輸入可以更多樣化。




?本次的分享就到此為止了,希望我的分享能給您帶來幫助,創作不易也歡迎大家三連支持,你們的點贊就是博主更新最大的動力!如有不同意見,歡迎評論區積極討論交流,讓我們一起學習進步!有相關問題也可以私信博主,評論區和私信都會認真查看的,我們下次再見

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

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

相關文章

3.Spring Cloud LoadBalancer 入門與使用

3.Spring Cloud LoadBalancer 入門與使用 1.什么是 LoadBalancer?1.1負載均衡分類1.2 常見負載均衡策略 2.為什么要學 LoadBalancer?3.如何使用?4.默認負載均衡策略5.隨機負載均策略5.1 創建隨機負載均衡器5.2 設置隨機負載均衡器 (局部設置)5.3 設置全局負載均衡器 6.Nacos…

基礎—SQL—DML(數據操作語言)修改和刪除

一、引言 接著上次博客,這次講解DML語句中的修改數據和刪除數據操作。 二、DML—修改數據 UPDATE 表名 SET 字段名1值1 ,字段名2值2 , ...[ WHERE 條件]; 注意:修改語句的條件可以有,也可以沒有。如果沒有條件,則會修改整張表的…

TypeScript 泛型

泛型基礎 泛型允許我們在定義函數、類或接口時使用參數化類型&#xff0c;從而實現代碼的通用性。例如&#xff1a; function identity<T>(arg: T): T {return arg; }let output identity<string>("hello"); console.log(output); // 輸出&#xff1a…

為什么就是不顯示呢?

為了練習JavaScript中函數的使用方法&#xff0c;寫了下面的關于Date&#xff08;&#xff09;函數的使用&#xff0c;奇怪的是&#xff0c;網頁中就是不顯示相關內容&#xff0c;為什么呢&#xff1f;&#xff1f;&#xff1f; <!DOCTYPE html> <html lang"en&…

【更新】一次“問題反饋”,下定決心做了多約束多目標智能算法的“模板”

目錄 1 主要內容 2 部分代碼 3 程序結果 4 下載鏈接 1 主要內容 關注該代碼的同學應該清楚&#xff0c;這個代碼已經免費更新了兩版了&#xff0c;修復和增加了一些約束內容&#xff0c;本次增加蓄電池初始時刻和終止時刻容量一致約束&#xff0c;可別小瞧這么簡單的增加約…

工控一體機10.1寸顯示器電容觸摸屏(YA05WK)產品規格說明書

如果您對工控一體機有任何疑問或需求&#xff0c;或者對如何集成工控一體機到您的業務感興趣&#xff0c;可移步控芯捷科技。 一、硬件功能介紹 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架構&#xff0c;主頻1.2GHz的CPU。采用12V供電&#xff0c;標配5寸…

2024.05.13 校招 實習 內推 面經

綠*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;內推/實習/校招匯總表格 1、實習 | 寧德新能源2025實習生招聘全面啟動 實習 | 寧德新能源2025實習生招聘全面啟動 2、實習 | 中國工業和信息化部電子第五研究所- 2025屆薪火計劃OFFER快捷通道正式開啟 實習 | 中…

深入理解深度學習中的激活層:Sigmoid和Softmax作為非終結層的應用

深入理解深度學習中的激活層&#xff1a;Sigmoid和Softmax作為非終結層的應用Sigmoid 和 Softmax 激活函數簡介Sigmoid函數Softmax函數 Sigmoid 和 Softmax 作為非終結層多任務學習特征變換增加網絡的非線性實際案例 注意事項結論 深入理解深度學習中的激活層&#xff1a;Sigmo…

云聯網驅動的全球智能網絡

在當今這個全球一體化加速的時代&#xff0c;企業網絡的邊界正被無限擴展&#xff0c;跨國運營、多云環境和遠程工作模式已經成為常態。中國聯通依托其強大的全球網絡資源&#xff0c;推出了以云聯網為核心技術的全球化智能組網方案&#xff0c;旨在為全球企業提供前所未有的靈…

什么是DELINS交貨指示?

DELINS 是指 Delivery Instruction&#xff08;交貨指示&#xff09;報文&#xff0c;用于在供應鏈管理中傳遞交貨指令和相關信息。該報文用于在供應鏈中的不同合作伙伴之間交換關于交貨的詳細信息。 DELINS 報文的主要功能 交貨指示&#xff1a;傳達具體的交貨指令&#xff…

如何評價GPT-4o

對比分析&#xff1a;GPT-4o與GPT-4 在人工智能領域的浪潮中&#xff0c;OpenAI的GPT系列模型一直是備受矚目的焦點。GPT-4o作為GPT系列的最新成員&#xff0c;相較于其前代GPT-4&#xff0c;無疑帶來了許多值得關注的改進和變化。 首先&#xff0c;從版本更迭的角度來看&#…

【Python】 深入理解 Python 包管理器:pip vs conda

基本原理 在Python編程世界中&#xff0c;包管理器是一個不可或缺的工具。它幫助開發者安裝、更新和管理Python庫。目前&#xff0c;最流行的兩個包管理器是pip和conda。了解它們之間的區別&#xff0c;對于Python開發者來說至關重要。 pip pip是Python的官方包管理器&#…

智慧農田視頻監控技術應用:智能監管引領農業新時代

據新聞報道&#xff0c;5月24日合肥市公安局接到群眾報警&#xff0c;反映自己辛苦種植的小麥有幾十畝地被人偷偷用收割機盜割。公安機關迅速出警并立案偵查&#xff0c;通過查看監控視頻得知&#xff0c;用戶所在的公司租用了幾千畝土地進行農業種植&#xff0c;因公司與村民之…

Day26

Day26 注解 什么是注解 java.annotation包Annotation是從JDK1.5開始引入的新技術&#xff0c;注解即可以對程序員解釋又可以對程序解釋 注解與注釋的區別 注釋&#xff1a;對程序員解釋代碼信息注解&#xff1a;對程序和程序員解釋代碼信息 注解的所用 不是程序本身&#xff0…

【C語言】9.C語言函數棧幀的創建和銷毀

C語言函數棧幀的創建和銷毀 看完本文你能了解什么? 局部變量是怎么創建的&#xff1f;為什么局部變量的值是隨機值&#xff1f;函數是怎么傳參的&#xff1f;傳參的順序是怎么樣的&#xff1f;實參和形參是什么關系&#xff1f;函數調用是怎么做的&#xff1f;函數調用結束后怎…

LeetCode hot100-57-G

17. 電話號碼的字母組合 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合。答案可以按 任意順序 返回。給出數字到字母的映射如下&#xff08;與電話按鍵相同&#xff09;。注意 1 不對應任何字母。不會&#xff0c;放IDEA里執行了一下大概理解了流程 …

『大模型筆記』KV緩存:Transformer中的內存使用!

『大模型筆記』KV緩存:Transformer中的內存使用! 文章目錄 一. KV緩存:Transformer中的內存使用!1.1. 介紹1.2. 自注意力機制回顧1.3. KV 緩存的工作原理1.4. 內存使用和示例1.4.1. 存儲鍵值緩存需要多少內存1.4.2. Example: OPT-30B(300億參數)四. 參考文獻進一步閱讀:…

深圳比創達電子|EMC與EMI濾波器:電子設備的“電磁防護罩”

在電子科技日新月異的今天&#xff0c;電磁兼容性&#xff08;EMC&#xff09;問題越來越受到工程師和技術人員的關注。其中&#xff0c;電磁干擾&#xff08;EMI&#xff09;和電磁干擾抑制&#xff08;即EMI濾波器&#xff09;是實現良好EMC性能的關鍵技術之一。 一、EMC與E…

KineFX —— 簡介

KineFX是綁定和動畫的框架和工具集&#xff0c;可在SOP級別創建和編輯角色&#xff1b;可從頭創建自己的KineFX角色&#xff0c;或使用特定的KineFX SOP和常規的SOP去編輯導入的角色和動畫&#xff1b; 程序化綁定 KineFX構建與程序化綁定的原則上&#xff0c;可快速非破壞性迭…

AI繪畫Stable Diffusion【藝術寫真】:蒙版法圖生圖,局部重繪實現AI藝術寫真

大家好&#xff0c;我是設計師阿威 之前我分享過幾篇使用SD插件換臉方式實現AI寫真的教程&#xff0c;主要存在2個大的問題。 &#xff08;1&#xff09;人臉相似度 &#xff08;2&#xff09;生成的圖片整體色調有時候會比較怪異 對于上面的問題&#xff0c;在對圖片質量要…