網絡編程—Socket套接字(UDP)

上篇文章:

網絡編程—網絡概念https://blog.csdn.net/sniper_fandc/article/details/146923380?fromshare=blogdetail&sharetype=blogdetail&sharerId=146923380&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目錄

1 概念

2 Socket套接字

3 UDP數據報套接字


1 概念

????????(1)網絡編程:指網絡上的主機,通過不同的進程,以編程的方式實現網絡通信(網絡數據傳輸)。

????????進程具有隔離性,因此不同的進程間要通信就得通過共享的公共區域來交換數據,網卡即是一種共享公共區域。

????????(2)客戶端(Client)/服務器(Server):客戶端是數據發送方,服務器是數據接收方,由于服務器是被動接收數據,不知道客戶端什么時候發送數據,因此服務器經常是24小時運行。

????????(3)請求(request)和響應(response):客戶端發送給服務器的數據,服務器返回給客戶端的數據。

????????(4)客戶端/服務器交互方式:一問一答(瀏覽網頁)、多問一答(上傳文件)、一問多答(下載文件)和多問多答(遠程控制、游戲串流(手機連接電腦玩電腦游戲))。

2 Socket套接字

????????Socket即是傳輸層(操作系統)提供給程序員的API,有基于TCP和UDP兩種類型,原始的API是C語言的,經過JVM包裝后,形成了Java的Socket API。

3 UDP數據報套接字

????????基于UDP的Socket主要是DatagramSocket,用于發送和接收UDP數據報,作用和操作方式都類似文件(打開Socket文件(對應網卡),發送/接收數據報,關閉文件)。

構造方法/方法

含義

DatagramSocket()

構造方法,創建一個UDP數據報套接字的Socket,綁定到本機任意一個隨機端口(一般用于客戶端)

DatagramSocket(int port)

構造方法,創建一個UDP數據報套接字的Socket,綁定到本機指定的端口(一般用于服務端)

void receive(DatagramPacket p)

從套接字接收數據報(如果沒有接收到數據報,該方法會阻塞等待)

void send(DatagramPacket p)

從套接字發送數據報包(不會阻塞等待,直接發送)

void close()

關閉數據報套接字

????????DatagramPacket是數據報的API,用來組織需要發送和接收的數據。

構造方法/方法

含義

DatagramPacket(byte[]?buf, int length)

構造方法,創建一個DatagramPacket用來接收數據報接收的數據保存在buf,length是數據長度

DatagramPacket(byte[]?buf, int offset, int?length,?SocketAddress address

構造方法,創建一個DatagramPacket用來發送數據報發送的數據保存在buf,offset是起始下標,length是數據長度,address指定目標主機的IP和端口號

InetAddress?getAddress()

從接收的數據報中,獲取發送端主機IP地址或從發送的數據報中,獲取接收端主機IP地址

int getPort()

從接收的數據報中,獲取發送端主機的端口號或從發送的數據報中,獲

取接收端主機端口號

byte[] getData()

獲取數據報中的數據

????????而使用InetSocketAddress(InetAddress addr, int port)即可創建一個Socket地址,包含IP地址和端口號,它是SocketAddress的子類。

????????下面利用UDP數據報套接字實現一個回顯服務器,回顯服務器是指客戶端發送什么,服務器就返回什么。

public class UdpServer {//回顯服務器端口號private ?final int PORT = 8000;public ?DatagramSocket datagramSocket = null;//通過端口創建udp服務器(本質是打開一個socket文件)public UdpServer() throws SocketException {datagramSocket = new DatagramSocket(PORT);}//啟動服務器public void start() throws IOException {System.out.println("服務器已啟動");//服務器需要24小時啟動因此寫成死循環while(true){//1.創建接收請求的數據報(分配字節數組空間)并接收請求DatagramPacket datagramPacket = new DatagramPacket(new byte[4096],4096);//該方法會一直阻塞等待直到客戶端發送請求datagramSocket.receive(datagramPacket);//2.解析請求構造響應數據報String request = new String(datagramPacket.getData(),0,datagramPacket.getLength());//3.根據請求構造響應(服務器業務邏輯)String response = process(request);//要用指定發送地址的構造方法(發送地址可以從接收的請求數據報中獲取)DatagramPacket datagramPacketResponse = new DatagramPacket(response.getBytes(),response.getBytes().length,datagramPacket.getSocketAddress());//4.返回響應datagramSocket.send(datagramPacketResponse);System.out.printf("[%s:%d] request=%s;response=%s\n",datagramPacket.getAddress().toString(),datagramPacket.getPort(),request,response);}}//回顯服務器就是發送什么請求返回什么響應private String process(String request) {return request;}public static void main(String[] args) throws IOException {//啟動服務器UdpServer server = new UdpServer();server.start();}}public class UdpClient {//創建客戶端private DatagramSocket socket = null;public UdpClient() throws SocketException {//客戶端一般隨機生成端口號socket = new DatagramSocket();}//啟動客戶端public void start() throws IOException {Scanner scanner = new Scanner(System.in);while(true){//1.構造請求System.out.print(">");String req = scanner.next();//構造的請求數據報既要包含數據又要包含地址(IP+端口)DatagramPacket request = new DatagramPacket(req.getBytes(),req.getBytes().length,InetAddress.getByName("127.0.0.1"),8000);//2.發送請求socket.send(request);//3.接受響應并解析響應DatagramPacket response = new DatagramPacket(new byte[4096],4096);socket.receive(response);String resp = new String(response.getData(),0,response.getLength());//4.將響應返回給用戶System.out.printf("request=%s,response=%s\n",req,resp);}}public static void main(String[] args) throws IOException {UdpClient udpClient = new UdpClient();udpClient.start();}}

????????在服務器代碼中,需要注意response.getBytes().length不等于response.length(),前一個方法獲取的是字節長度,而后一個方法獲取的是字符長度,當字符中有中文時,字節長度和字符長度并不相等,因此不能替換。而字符串“127.0.0.1”是環回IP,表示本機(自己發給自己)。

????????根據結果顯示,雖然發送的一條請求hello World,但是卻被拆成hello和World兩條請求發送了,這是因為這里使用Scanner類的next()方法,該方法以空格作為結束進行分割,因此發送兩條請求。如果向發送一條,就可以使用nextLine(),該方法以換行符結束。

下篇文章:

網絡編程—Socket套接字(TCP)https://blog.csdn.net/sniper_fandc/article/details/146923783?fromshare=blogdetail&sharetype=blogdetail&sharerId=146923783&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

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

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

相關文章

深度學習deeplearn1

import torch # 導入 PyTorch 庫,PyTorch 是一個用于深度學習和張量計算的強大庫x torch.arange(12) # 創建一個包含從 0 到 11 的整數的一維張量 x # torch.arange 函數用于生成一個指定范圍的整數序列print(x) # 打印張量 x 的內容print(x.shape) # 打印張量 x 的…

無線通信技術(三):5G NR通信頻帶劃分與應用場景

目錄 一.5G NR頻帶劃分概述 二.全球運營商5G頻帶分配對比 三.5G頻帶的應用場景 5G網絡的發展離不開頻譜資源的合理分配。不同的頻段決定了5G的覆蓋范圍、傳輸速率和應用場景。本文將系統介紹5G NR頻帶劃分,并結合實際應用場景,理解不同頻段的特性及其適用環境。 …

觀察者模式在Java單體服務中的運用

觀察者模式主要用于當一個對象發生改變時,其關聯的所有對象都會收到通知,屬于事件驅動類型的設計模式,可以對事件進行監聽和響應。下面簡單介紹下它的使用: 1 定義事件 import org.springframework.context.ApplicationEvent;pu…

YOLO 獲取 COCO 指標終極指南 | 從標簽轉換到 COCOAPI 評估 (訓練/驗證) 全覆蓋【B 站教程詳解】

? YOLO 輕松獲取論文 COCO 指標:AP(small,medium,large )| 從標簽轉換到 COCOAPI 評估 (訓練/驗證) 全覆蓋 文章目錄 一、摘要二、為什么需要 COCO 指標評估 YOLO 模型?三、核心挑戰與解決方案 (視頻教程核…

[C/C++]文件輸入輸出

C style FILE * fileptr filename"C:\\file.txt" fopenfclosefprintfC style //指向std::ostream的指針 #include <iostream> #include <fstream>int main() {std::ostream* output &std::cout; // 默認指向控制臺// 輸出到控制臺*output <&l…

【Android】界面布局-線性布局-例子

線性布局&#xff08;LinearLayout&#xff09;是一種重要的界面布局中&#xff0c;也是經常使用到的一種界面布局 ? 在線性布局中&#xff0c;所有的子元素都按照垂直或水平的順序在界面上排列 ?如果垂直排列&#xff0c;則每行僅包含一個界面元素 ?如果水平排列&…

HTML表單屬性1

value 屬性 value 設置輸入字段的初始值&#xff08;默認值&#xff09;,提交表單時&#xff0c;如果用戶未做修改&#xff0c;將發送value中的默認值 <form action"#">First name: <br><input type"text" name"firstname" val…

JavaScrip圖標工具Chart.js之 氣泡圖

氣泡圖用于展示三個變量之間的關系。 氣泡的位置由前兩個變量決定&#xff0c;對應的是 X 軸和 Y 軸&#xff0c;第三個參數為氣泡的大小。 {// X 軸對應值x: number,// Y 軸對應值y: number,// 氣泡半徑&#xff0c;單位為像素r: number } 泡圖的 type 屬性為 bubble &#xf…

Git 教程:從 0 到 1 全面指南 教程【全文三萬字保姆級詳細講解】

目錄 什么是 Git &#xff1f; Git 與 SVN 區別 Git 安裝配置 Linux 平臺上安裝 Centos/RedHat 源碼安裝 Windows 平臺上安裝 使用 winget 工具 Mac 平臺上安裝 Git 配置 用戶信息 文本編輯器 差異分析工具 查看配置信息 生成 SSH 密鑰&#xff08;可選&#xf…

Java導出excel,表格插入pdf附件,以及實現過程中遇見的坑

1.不能使用XSSFWorkbook,必須使用HSSFWorkbook,否則導出excel后&#xff0c;不顯示插入的圖標和內容&#xff0c;如果是讀取的已有的excel模板&#xff0c;必須保證excel的格式是xls&#xff0c;如果把xlsx通過重命名的方式改為xls&#xff0c;是不生效的&#xff0c;后面執行下…

國內外網絡安全政策動態(2025年3月)

?? 1.《關于進一步加強智能網聯汽車產品準入、召回及軟件在線升級管理的通知》發布 3月1日&#xff0c;工業和信息化部、市場監管總局聯合發布《關于進一步加強智能網聯汽車產品準入、召回及軟件在線升級管理的通知》&#xff08;以下簡稱《通知》&#xff09;。 該通知旨在…

什么是緩存穿透、緩存雪崩、緩存擊穿?

什么是緩存&#xff1f; 緩存就是數據交換的緩沖區&#xff0c;是存貯數據的臨時地方&#xff0c;一般讀寫性能較高。 怎么防止緩存穿透&#xff1f; 緩存穿透是指客戶端請求的數據在緩存中和數據庫中都不存在&#xff0c;這樣緩存永遠不會生效&#xff0c;這些請求都會打到…

深度學習在自動駕駛車輛車道檢測中的應用

引言 自動駕駛技術是人工智能領域的一個前沿方向&#xff0c;而車道檢測是實現自動駕駛的關鍵技術之一。通過識別和跟蹤車道線&#xff0c;自動駕駛車輛能夠保持在車道內行駛&#xff0c;提高行車安全。本文將詳細介紹如何使用深度學習技術進行車道檢測&#xff0c;并提供一個…

大模型如何引爆餐飲與電商行業變革

大模型如何引爆餐飲與電商行業變革&#xff1f; 一、時代背景&#xff1a;大模型重構產業邏輯的底層動力 1. 技術躍遷催生效率革命 2025年&#xff0c;大模型技術迎來"普惠臨界點"。李開復在中關村論壇指出&#xff0c;大模型推理成本每年降低10倍&#xff0c;使得…

chromium魔改——繞過無限debugger反調試

在進行以下操作之前&#xff0c;請確保已完成之前文章中提到的 源碼拉取及編譯 部分。 如果已順利完成相關配置&#xff0c;即可繼續執行后續操作。 在瀏覽器中實現“無限 debugger”的反調試技術是一種常見的手段&#xff0c;用于防止他人通過開發者工具對網頁進行調試或逆向…

在win11 環境下 新安裝 WSL ubuntu + 換國內鏡像源 + ssh + 桌面環境 + Pyhton 環境 + vim 設置插件安裝

在win11 環境下 新安裝 WSL ubuntu ssh gnome 桌面環境 Pyhton 環境 vim 設置插件安裝 簡單介紹詳細流程換國內鏡像源安裝 ssh 桌面環境python 環境vim 設置插件安裝 簡單介紹 內容有點長&#xff0c;這里就先簡單描述內容了。主要是快速在 Win11 搭建一個 wsl 的 linux 環…

python 命名空間與作用域 可變與不可變對象 閉包

python 命名空間與作用域 可變與不可變對象 閉包 作用域規則順序為&#xff1a; L->E->G->B 如果變量在局部內找不到&#xff0c;便會去局部外的局部找&#xff08;例如閉包&#xff09;&#xff0c;再找不到就會去全局找&#xff0c;再找不到就去內置中找。 若要在函…

安裝 TabbyAPI+Exllamav2 和 vLLM 的詳細步驟

在 5090 顯卡上成功安裝 TabbyAPIExllamav2 和 vLLM 并非易事&#xff0c;經過一番摸索&#xff0c;我總結了以下詳細步驟&#xff0c;希望能幫助大家少走彎路。 重要提示&#xff1a; 用戶提供的 PyTorch 安裝使用了 cu128&#xff0c;這并非標準 CUDA 版本。請根據你的系統實…

使用url-loader處理圖片等資源文件

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

EIP-712:類型化結構化數據的哈希與簽名

1. 引言 以太坊 EIP-712: 類型化結構化數據的哈希與簽名&#xff0c;是一種用于對類型化結構化數據&#xff08;而不僅僅是字節串&#xff09;進行哈希和簽名 的標準。 其包括&#xff1a; 編碼函數正確性的理論框架&#xff0c;類似于 Solidity 結構體并兼容的結構化數據規…