探索 `DatagramSocket` 類

DatagramSocket 類是 Java 網絡編程中的一個關鍵組件,專門用于處理 UDP(用戶數據報協議)通信。與基于連接的 TCP 不同,UDP 是一種無連接協議,適用于對速度和效率要求較高,但對可靠性要求相對較低的場景。

本文將詳細介紹 DatagramSocket 類的基本用法、實現細節以及實際應用中的一些高級特性。

什么是 DatagramSocket 類?

DatagramSocket 類位于 Java 標準庫的 java.net 包中。它提供了發送和接收數據報(datagram)的功能,這些數據報是通過 UDP 協議進行傳輸的。

基本用法

在使用 DatagramSocket 進行通信時,通常需要創建兩個類的實例:DatagramSocketDatagramPacket。前者用于發送和接收數據報,后者用于封裝發送和接收的數據。

創建 DatagramSocket 實例

要創建一個 DatagramSocket 實例,可以使用以下代碼:

import java.net.DatagramSocket;
import java.net.SocketException;public class UDPSocketExample {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(9876);System.out.println("Socket created on port 9876");} catch (SocketException e) {e.printStackTrace();}}
}

在這個示例中,我們創建了一個綁定到端口 9876 的 DatagramSocket 對象。此端口將用于接收來自客戶端的數據。

發送數據報

為了發送數據報,需要創建一個 DatagramPacket 對象,并指定目標地址和端口:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPSender {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket();String message = "Hello, UDP!";byte[] buffer = message.getBytes();InetAddress address = InetAddress.getByName("localhost");DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876);socket.send(packet);System.out.println("Message sent: " + message);socket.close();} catch (Exception e) {e.printStackTrace();}}
}

接收數據報

接收數據報時,需要創建一個緩沖區來存儲接收到的數據:

import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPReceiver {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(9876);byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String receivedMessage = new String(packet.getData(), 0, packet.getLength());System.out.println("Message received: " + receivedMessage);socket.close();} catch (Exception e) {e.printStackTrace();}}
}

詳細分析

構造函數

DatagramSocket 提供了多種構造函數,可以創建綁定到特定端口或 IP 地址的套接字。例如:

public DatagramSocket() throws SocketException
public DatagramSocket(int port) throws SocketException
public DatagramSocket(int port, InetAddress laddr) throws SocketException

發送和接收方法

  • send(DatagramPacket p):發送數據報包。
  • receive(DatagramPacket p):接收數據報包。該方法是阻塞的,會等待直到接收到數據報包。

關閉套接字

使用完 DatagramSocket 后,應該調用 close() 方法釋放資源:

socket.close();

高級特性

設置超時

可以通過 setSoTimeout() 方法為 DatagramSocket 設置超時時間:

socket.setSoTimeout(5000); // 設置超時時間為 5000 毫秒

廣播

UDP 允許廣播消息到一個網絡上的所有設備。可以通過設置數據包的目標地址為廣播地址來實現:

InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, broadcastAddress, 9876);
socket.send(packet);

多播

多播是一種特殊的廣播,允許將數據發送到特定組的多個主機。Java 提供了 MulticastSocket 類來支持多播。

實際應用示例

下面是一個簡單的聊天應用,通過 UDP 實現:

發送端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class UDPChatSender {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket();InetAddress address = InetAddress.getByName("localhost");Scanner scanner = new Scanner(System.in);while (true) {System.out.print("Enter message: ");String message = scanner.nextLine();byte[] buffer = message.getBytes();DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876);socket.send(packet);if ("exit".equalsIgnoreCase(message)) {break;}}socket.close();scanner.close();} catch (Exception e) {e.printStackTrace();}}
}

接收端

import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPChatReceiver {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(9876);byte[] buffer = new byte[1024];while (true) {DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String receivedMessage = new String(packet.getData(), 0, packet.getLength());System.out.println("Received: " + receivedMessage);if ("exit".equalsIgnoreCase(receivedMessage)) {break;}}socket.close();} catch (Exception e) {e.printStackTrace();}}
}

總結

DatagramSocket 類是 Java 網絡編程中處理 UDP 通信的核心工具。通過掌握其基本用法和高級特性,可以構建高效、可靠的 UDP 應用。

希望這篇文章能幫助你更好地理解和使用 DatagramSocket 類。如果你有任何問題或想法,歡迎在評論區分享!

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

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

相關文章

【JavaScript】包裝類

包裝類 JS 提供了三個主要的包裝類:String、Number、Boolean。如果嘗試把原始類型(string、number、boolean)數據當成對象使用,JS 會自動將其轉換為對應包裝類的實例。 我們先來看一下 “基本類型數據” 及 “其包裝類的實例” …

個人倒計時頁面源碼,實用倒計時單頁源碼

一、源碼描述 這是一款非常實用的個人倒計時頁面,支持設置未來一年時間,支持設置背景音樂,支持自定義下拉頁面,點擊向下箭頭查看。 二、源碼截圖 三、源碼下載

docker 常用命令,后面不斷更新

1.從Docker容器中下載文件到本地的方法 使用 docker cp 命令:該命令可以將文件或目錄從容器復制到主機。該方法簡單快捷,適用于少量文件的下載。 # 將容器名為my_container中的 /data/file.txt文件復制到本地/path/to/save/file.txt docker cp my_container:/data/…

深入探討【C++容器適配器】:現代編程中的【Stack與Queue】的實現

目錄 一、Stack(棧) 1.1 Stack的介紹 1.2 Stack的使用 1.3 Stack的模擬實現 二、Queue(隊列) 2.1 Queue的介紹 2.2 Queue的使用 2.3 Queue的模擬實現 三、容器適配器 3.1 什么是適配器 3.2 為什么選擇deque作為stack和…

kylin入門教程

Apache Kylin的入門教程主要涵蓋以下幾個方面: 一、Apache Kylin簡介 Apache Kylin是一個開源的分布式分析引擎,提供Hadoop之上的SQL接口及多維分析(OLAP)能力以支持超大規模數據。最初由eBay Inc.開發并貢獻至開源社區&#xf…

基于Vue和UCharts的前端組件化開發:實現高效、可維護的詞云圖與進度條組件

基于Vue和UCharts的前端組件化開發:實現高效、可維護的詞云圖與進度條組件 摘要 隨著前端技術的迅速發展和業務場景的日益復雜,傳統的整塊應用開發方式已無法滿足現代開發的需求。組件化開發作為一種有效的解決方案,能夠將系統拆分為獨立、…

Shell基礎之函數和數組

目錄 函數 什么是函數 函數的語法 函數的調用 函數的返回值 函數的案例 函數變量的作用域 遞歸函數 函數庫文件 數組 定義數組語法 數組操作 獲取所有元素 獲取元素下標 獲取數組長度 獲取數組元素 數組添加元素 刪除數組元素 刪除數組 遍歷數組元素 數組案…

解決pycharm無法識別miniconda

解決pycharm無法識別miniconda 找到miniconda安裝目錄下condabin/conda.bat文件,點擊load即可識別codna環境 a環境

Spring Boot(七十九):SprngBoot整合Apache tika做文件類型檢測

之前有一個章節介紹了Apache tika實現文檔內容解析,地址如下:Spring Boot(六十八):SpringBoot 整合Apache tika 實現文檔內容解析_springboot tika pptx-CSDN博客 下面我們介紹Apache tika實現文件類型檢測 1 引入依賴 <dependency><groupId>org.apache.tika&…

Docker 掛載目錄空間占滿修改/var/lib/docker/overlay2 的路徑解決方案

本文詳細描述了在CentOS7系統中卸載舊版Docker、安裝依賴、添加Docker源、配置存儲路徑并啟動Docker&#xff0c;使其在/home目錄下運行的過程。 以下是在CentOS 7下重新安裝Docker并將其安裝在/home/下的完整步驟&#xff1a; 卸載舊版本的Docker。如果您之前已經安裝了Dock…

仕考網:沒有學位證能考公務員嗎?

公務員考試需要滿足報名條件才能參加&#xff0c;沒有學位證能考公嗎? 沒有學位證書的考生也有機會參與公務員考試雖然可以選擇的崗位比較少&#xff0c;但可以報考參加那些不設定學位要求的崗位。當發布的公務員招錄信息中某一職位的學位要求標注為“無要求”時&#xff0c;…

【C++】:繼承[下篇](友元靜態成員菱形繼承菱形虛擬繼承)

目錄 一&#xff0c;繼承與友元二&#xff0c;繼承與靜態成員三&#xff0c;復雜的菱形繼承及菱形虛擬繼承四&#xff0c;繼承的總結和反思 點擊跳轉上一篇文章&#xff1a; 【C】&#xff1a;繼承(定義&&賦值兼容轉換&&作用域&&派生類的默認成員函數…

MATLAB Gazebo聯合仿真

準備仿真環境&#xff1a;在Gazebo中設置仿真場景&#xff0c;包括機器人模型、環境布局、傳感器和執行器等。編寫MATLAB腳本&#xff1a;在MATLAB中編寫控制算法和數據處理腳本&#xff0c;用于接收Gazebo中的傳感器數據&#xff0c;并生成控制命令。建立通信&#xff1a;通過…

DEBUG:jeston卡 遠程ssh編程

問題 jeston 打開網頁 gpt都不方便 而且只需要敲命令就行 解決 下載MobaXterm(window執行) liunx需要虛擬機 軟件 遠程快速復制命令

PHP文字ocr識別接口示例、人工智能的發展

全球在人工智能升級的大背景下&#xff0c;有一定規模的制造商開始大量部署人工智能機器人、系統&#xff0c;以此取代危險、簡單和重復性的工作。各種人工智能技術的迅猛發展&#xff0c;正在驅動各行業就業市場發現變革。 京東物流大家并不陌生&#xff0c;京東快遞機器人在…

vue中table內容和lable對不齊解決方案

問題&#xff1a; 代碼片段&#xff1a; <template><el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"title" label"標題" width"80px" /><el-table-column prop"n…

Windows安全日志導致環境內存占用過高

Windows 環境內存占用高不釋放&#xff0c;目前遇到的常見情況如下&#xff1a; 情況一&#xff1a;JVM內存泄漏 這種網上的排查方式有很多&#xff0c;自行查閱即可 情況二&#xff1a;SQLserver內存配置過大 這種也是&#xff0c;從網上查找修改方式然后修改即可 情況三…

python的面向對象編程

為什么要面向對象編程&#xff1f; 偉大的領袖毛澤東曾說過&#xff1a;編程最大的敵人是重復。 最開始&#xff0c;在程序中寫的一條條語句&#xff0c;在執行的時候會變成一條條指令交給CPU執行。這就是**“程序是指令的集合”** 。為了簡化程序的設計&#xff0c;引入了函數…

WebPages 全局:深入解析現代網頁設計與開發

WebPages 全局:深入解析現代網頁設計與開發 引言 隨著互聯網技術的飛速發展,網頁設計與開發已經成為了數字化時代的重要組成部分。從簡單的文本和圖像展示,到如今復雜的多媒體交互體驗,網頁設計經歷了翻天覆地的變化。本文將深入探討WebPages全局,包括網頁設計的基本概念…

Defensor 4.5:構建數據資產為中心的安全運營體系

5月31日“向星力”未來數據技術峰會上&#xff0c;星環科技重磅發布數據安全管理平臺 Defensor 4.5版本。新版本引入了以數據資產為中心的數據安全運營體系&#xff0c;通過智能化大模型技術&#xff0c;幫助企業快速、精準地識別核心重要資產&#xff1b;建設全局的數據安全策…