python之UDP網絡應用程序開發

文章目錄

  • 版權聲明
  • UDP網絡應用程序開發
    • UDP初識
    • UDP知識要點
    • socket類的使用
    • UDP發送數據開發流程分析
    • UDP服務客戶端通信栗子
    • UDP廣播發送

版權聲明

  • 本博客的內容基于我個人學習黑馬程序員課程的學習筆記整理而成。我特此聲明,所有版權屬于黑馬程序員或相關權利人所有。本博客的目的僅為個人學習和交流之用,并非商業用途。
  • 我在整理學習筆記的過程中盡力確保準確性,但無法保證內容的完整性和時效性。本博客的內容可能會隨著時間的推移而過時或需要更新。
  • 若您是黑馬程序員或相關權利人,如有任何侵犯版權的地方,請您及時聯系我,我將立即予以刪除或進行必要的修改。
  • 對于其他讀者,請在閱讀本博客內容時保持遵守相關法律法規和道德準則,謹慎參考,并自行承擔因此產生的風險和責任。本博客中的部分觀點和意見僅代表我個人,不代表黑馬程序員的立場。

UDP網絡應用程序開發

UDP初識

  • UDP(User Datagram Protocol)是一種無連接的傳輸層協議,它不保證數據傳輸的可靠性和有序性,但具有傳輸速度快的優點
  • UDP協議可以用于音頻、視頻、游戲等實時應用場景,因為這些應用對數據傳輸的實時性要求較高,而對數據傳輸的可靠性和有序性要求較低。
  • UDP通信的優點是速度快,適用于實時應用場景,但缺點是不可靠,容易丟失數據,因此在需要保證數據傳輸可靠性的場景下不適用。
    UDP通信的基本流程如下:
  1. 發送端將要發送的數據打包成UDP數據包,包括目標IP地址、目標端口號、數據長度和數據內容等信息。

  2. 發送端將UDP數據包發送給目標主機。

  3. 接收端接收到UDP數據包后,將數據包中的信息解析出來,包括發送端IP地址、發送端端口號、數據長度和數據內容等信息。

  4. 接收端根據發送端的IP地址和端口號,將數據傳輸到相應的應用程序中進行處理。


UDP知識要點

  1. UDP網絡通信本質不區分客戶端和服務端,在實際應用中,通常會將發送數據的一方稱為客戶端,將接收數據的一方稱為服務端。
    • 在實際應用中,客戶端通常是發送請求的一方,服務端通常是提供服務的一方。例如,在客戶端與服務端之間進行網絡游戲通信時,客戶端會向服務端發送游戲請求,服務端會接收請求并處理,然后再將處理結果發送回客戶端。在這種情況下,客戶端和服務端的角色是明確的。
  2. UDP協議可以直接通過對方IP地址和端口號發送數據,而不需要像TCP協議那樣需要先建立連接。
    • 在UDP協議中,發送數據時需要指定目標主機的IP地址和端口號,數據直接發送到目標主機。接收數據時,可以通過綁定本地IP地址和端口號來指定接收數據的地址和端口號,然后等待數據的到來。當有數據到達時,就可以直接從數據包中獲取發送方的IP地址和端口號,從而實現直接通信。
  3. 在UDP協議中,可以指定一個固定的端口用于發送和接收數據,也可以讓操作系統自動選擇一個空閑端口。
    • 在發送UDP數據時,可以指定源端口和目標端口。如果指定了源端口,那么每次發送數據時就會使用該端口。如果未指定源端口,操作系統會自動選擇一個空閑端口,然后發送數據。在接收UDP數據時,可以指定一個固定的端口來接收數據。如果未指定端口,操作系統會自動選擇一個空閑端口來接收數據。

socket類的使用

  • 參看python之TCP的網絡應用程序開發的socket類的使用部分的內容
  • 栗子
  1. 創建UDP套接字對象:
    import socket# 創建UDP套接字對象
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
  2. 綁定本地IP地址和端口號:
    # 綁定本地IP地址和端口號
    local_addr = ('127.0.0.1', 8888)
    udp_socket.bind(local_addr)
    
  3. 發送UDP數據:
    # 發送UDP數據
    dest_addr = ('127.0.0.1', 9999)
    send_data = 'Hello, UDP!'
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
    
  4. 接收UDP數據:
    # 接收UDP數據
    recv_data, remote_addr = udp_socket.recvfrom(1024)
    print('Received from %s:%s' % remote_addr)
    print(recv_data.decode('utf-8'))
    
  5. 關閉UDP套接字對象:
    # 關閉UDP套接字對象
    udp_socket.close()
    

UDP發送數據開發流程分析

  • 服務端:
    1. 創建UDP套接字對象
    2. 綁定本地IP地址和端口號
    3. 接收UDP數據
    4. 發送UDP數據
    5. 關閉UDP套接字對象
  • 客戶端:
    1. 創建UDP套接字對象
    2. 發送UDP數據
    3. 接收UDP數據
    4. 關閉UDP套接字對象

UDP服務客戶端通信栗子

  • UDP服務端
import socketif __name__ == '__main__':# 創建UDP套接字對象udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 設置為非阻塞模式udp_socket.setblocking(False)# 綁定本地IP地址和端口號local_addr = ('127.0.0.1', 8888)udp_socket.bind(local_addr)while True:try:# 接收UDP數據recv_data, remote_addr = udp_socket.recvfrom(1024)print('Received from %s:%s' % remote_addr)print(recv_data.decode('utf-8'))# 發送UDP數據send_data = 'Hello, UDP客戶端!'udp_socket.sendto(send_data.encode('utf-8'), remote_addr)except BlockingIOError:pass# 發送UDP數據send_data = 'Hello, UDP客戶端!'udp_socket.sendto(send_data.encode('utf-8'), remote_addr)# 關閉UDP套接字對象udp_socket.close()
  • UDP客戶端
import socket
if __name__ == '__main__':# 創建UDP套接字對象udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 設置為非阻塞模式udp_socket.setblocking(False)# 發送UDP數據dest_addr = ('127.0.0.1', 8888)send_data = 'Hello, UDP服務端!'udp_socket.sendto(send_data.encode('utf-8'), dest_addr)# 接收UDP數據while True:try:recv_data, remote_addr = udp_socket.recvfrom(1024)print('Received from %s:%s' % remote_addr)print(recv_data.decode('utf-8'))breakexcept BlockingIOError:pass# 關閉UDP套接字對象udp_socket.close()

UDP廣播發送

  • 廣播地址(Broadcast Address)是專門用于同時向網絡中所有工作站進行發送的一個地址

  • 廣播地址是一個特殊的IP地址,用于向一個網絡中的所有設備發送數據。在IPv4中,廣播地址是由主機地址全為1和網絡地址組成的地址。例如,如果你的網絡地址是192.168.1.0,那么廣播地址就是192.168.1.255。

import socketif __name__ == '__main__':# 創建UDP套接字對象 將UDP套接字對象設置為廣播模式udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 設置廣播選項 socket.SO_BROADCAST廣播udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)# 廣播地址dest_addr = ('192.168.1.255', 8888)# 發送UDP數據send_data = 'Hello, UDP broadcast!'udp_socket.sendto(send_data.encode('utf-8'), dest_addr)# 關閉UDP套接字對象udp_socket.close()

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

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

相關文章

CodeWhisperer 體驗總結

CodeWhisperer 體驗總結 | CodeWhisperer 是一款亞馬遜新推出的通用代碼生成器 可以實時進行代碼數據的提供 還可以定義安全問題 CodeWhisperer 對個人用戶是免費使用 企業用戶需要訂閱使用 亞馬遜云科技開發者社區為開發者們提供全球的開發技術資源。這里有技術文檔、開發案例…

Linux:配置Ubuntu系統的鏡像軟件下載地址

一、原理介紹 好處:從國內服務器下載APT軟件,速度快。 二、配置 我這里配置的是清華大學的鏡像服務器地址 https://mirrors.tuna.tsinghua.edu.cn/ 1、備份文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2、清空sources.list ec…

廣告機/商業顯示屏_基于MT8788安卓主板方案

安卓主板在廣告機領域扮演著重要的角色。無論是在商場、車站、酒店、電梯、機場還是高鐵站,LED廣告機廣泛應用,并通過不同方式進行播放和管理。 廣告機/商業顯示屏_基于MT8788安卓主板方案 基于MT8788安卓主板方案的廣告機采用了聯發科MT8788八核芯片方案…

國標直流充電槍9孔分別啥意思?

DC:直流電源正 DC-:直流電源負 PE:接地(搭鐵)S:通訊CAN-H S-:通訊CAN-L CC1:充電連接確認 CC2:充電連接確認 A:12V A-:12V- 以上就是國標直流充電…

線上ES集群參數配置引起的業務異常案例分析

本文介紹了一次排查Elasticsearch node_concurrent_recoveries 引發的性能問題的過程。 一、故障描述 1.1 故障現象 1. 業務反饋 業務部分讀請求拋出請求超時的錯誤。 2. 故障定位信息獲取 故障開始時間 19:30左右開始 故障拋出異常日志 錯誤日志拋出timeout錯誤。 故障之前…

BTC 復興:Ordinals 帶來創新活力,BitVM 與 BitStream 相繼問世

除了備受矚目的 ETF,今年 Bitcoin 生態迎來全新的發展活力和機遇。Ordinals 協議的橫空出世,以此為基礎誕生的 BRC20 協議給整個比特幣生態帶去了一波新的能量,迎來銘文熱度高漲。而諸如 BitVM、BitStream 等新技術甫一問世,便引發…

openssl+ RSA + linux 簽名校驗開發實例(C++)

文章目錄 一、RSA簽名校驗二、RSA簽名校驗開發實例 一、RSA簽名校驗 RSA簽名校驗是一種用于驗證數字簽名的過程,它確保簽名是由擁有相應私鑰的合法實體創建的。以下是RSA簽名校驗的理論知識點: RSA密鑰對: RSA簽名使用一對公鑰和私鑰。公鑰用…

RPCS3(PlayStation 3游戲模擬器)漢化教程

RPCS3 RPCS3 是一款PlayStation 3 模擬器,可讓 Windows、Linux 或 BSD 系統的用戶運行索尼 PlayStation 3 游戲。 安裝教程 包含 Windows/Linux版本 詳細安裝漢化教程請查看文章 RPCS3(PS3模擬器)安裝及漢化教程 1.首先下載最新版 RPCS3模…

classifier-free-guidance 擴散模型引導生成

淺談擴散模型的有分類器引導和無分類器引導 - 知乎這篇文章主要比較一下擴散模型的引導生成的三種做法的區別。它們分別是用顯式分類器引導生成的做法,用隱式無分類器引導的做法和用CLIP計算跨模態間的損失來引導生成的做法。 Classifier-Guidance: Diffusion Mode……

瀏覽器是什么

瀏覽器是什么 本文簡要介紹瀏覽器的功能和組成。 瀏覽器(Web Browser)是一種用于訪問和瀏覽互聯網上的網頁和資源的軟件應用程序。它是用戶與互聯網交互的主要工具之一。 瀏覽器通過使用網絡協議(如HTTP、HTTPS等)與遠程服務器通…

從0開始學習JavaScript--JavaScript數據類型與數據結構

JavaScript作為一門動態、弱類型的腳本語言,擁有豐富的數據類型和數據結構,這些構建了語言的基礎,為開發者提供了靈活性和表達力。本文將深入探討JavaScript中的各種數據類型,包括基本數據類型和復雜數據類型,并介紹常…

nginx知識梳理及配置詳解

軟件開發全文檔獲取:點我獲取 nginx安裝 #nginx安裝 yum -y install gcc pcre-devel openssl-devel #依賴包 useradd -s /sbin/nologin nginx ./configure --prefix/usr/local/nginx #指定安裝目錄 --usernginx #指定用戶 --with-http_ss…

【數據庫篇】關系模式的表示——(1)問題的提出

1、關系模式的表示 R:表示關系的名字比如:sc選課表,student學生表。 U:表示一個關系模式的所有屬性,比如student表:U(sno,sname,sage,ssex)。 …

LedControl 庫說明文檔

LedControl 庫最初是為基于 8 位 AVR 處理器的 Arduino 板編寫的。但由于該代碼不使用處理器的任何復雜的內部功能,因此具有高度可移植性,并且應該在任何支持 和 功能的 Arduino(類似)板上pinMode()運行digitalWrite() 。 單個 M…

C練習題_3

一、單項選擇題(本大題共20小題,每小題2分,共40分。在每小題給出的四個備選項中,選出一個正確的答案,并將所選項前的字母填寫在答題紙的相應位置上。 以下正確的C語言自定義標識符是() A. la B. 2a C. do D. a.12 2.在C語言中,錯…

C# 之對象與Xml序列化工具類

寫在前面 一個常用的對象與Xml序列化工具類&#xff0c;使用系統類庫System.Xml&#xff0c;序列化時需要注意只能將對象的公共字段和讀/寫屬性轉換為 XML。不轉換方法、索引器、私有字段或只讀屬性。另外XmlSerializer 類無法序列化ArrayList數組和List<T>數組。 using…

3、Qt使用windeploy工具打包可執行文件

新建一個文件夾&#xff0c;把要打包的可執行文件exe拷貝過來 點擊輸入框&#xff0c;復制一下文件夾路徑 點擊電腦左下角&#xff0c;找到Qt文件夾&#xff0c; 點擊打開 “Qt 5.12.0 for Desktop” &#xff08;我安裝的是Qt 5.12.0版本&#xff09; 輸入“cd bin”&#xff…

springsecurity5.7.x和springsecurity6.x配置文件對比

springsecurity5和springsecurity6如何要實現多種登錄方式&#xff0c;自定義登錄方式都是一樣的操作步驟&#xff0c;主要有四個步驟。 一、自定義登錄用戶實體實現springsecurity中的UserDetails接口 二、自定義登錄用戶實現類實現springsecurity中的UserDetailsService接口 …

vivado產生報告閱讀分析20-QOR

Report QoR Suggestions report_qor_suggestions 命令是處理 QoR 建議對象時使用的主要命令。 QoR 建議對象會創建命令和屬性來改善設計的時序性能&#xff08; 欲知詳情 &#xff0c; 請參閱 QoR 建議 &#xff09; 。 report_qor_suggestions 命令可執行兩項任務 &am…

代碼隨想錄-刷題第七天

454. 四數相加II 題目鏈接&#xff1a;454. 四數相加II 思路&#xff1a;哈希法。使用map集合&#xff0c;key存放ab的值&#xff0c;value存放ab出現的次數。使用兩層循環&#xff0c;循環前兩個數組&#xff0c;找出ab&#xff0c;對map賦值。再用兩層循環&#xff0c;遍歷…