文章目錄
- 版權聲明
- UDP網絡應用程序開發
- UDP初識
- UDP知識要點
- socket類的使用
- UDP發送數據開發流程分析
- UDP服務客戶端通信栗子
- UDP廣播發送
版權聲明
- 本博客的內容基于我個人學習黑馬程序員課程的學習筆記整理而成。我特此聲明,所有版權屬于黑馬程序員或相關權利人所有。本博客的目的僅為個人學習和交流之用,并非商業用途。
- 我在整理學習筆記的過程中盡力確保準確性,但無法保證內容的完整性和時效性。本博客的內容可能會隨著時間的推移而過時或需要更新。
- 若您是黑馬程序員或相關權利人,如有任何侵犯版權的地方,請您及時聯系我,我將立即予以刪除或進行必要的修改。
- 對于其他讀者,請在閱讀本博客內容時保持遵守相關法律法規和道德準則,謹慎參考,并自行承擔因此產生的風險和責任。本博客中的部分觀點和意見僅代表我個人,不代表黑馬程序員的立場。
UDP網絡應用程序開發
UDP初識
- UDP(User Datagram Protocol)是一種無連接的傳輸層協議,它不保證數據傳輸的可靠性和有序性,但具有傳輸速度快的優點。
- UDP協議可以用于音頻、視頻、游戲等實時應用場景,因為這些應用對數據傳輸的實時性要求較高,而對數據傳輸的可靠性和有序性要求較低。
- UDP通信的優點是速度快,適用于實時應用場景,但缺點是不可靠,容易丟失數據,因此在需要保證數據傳輸可靠性的場景下不適用。
UDP通信的基本流程如下:
-
發送端將要發送的數據打包成UDP數據包,包括目標IP地址、目標端口號、數據長度和數據內容等信息。
-
發送端將UDP數據包發送給目標主機。
-
接收端接收到UDP數據包后,將數據包中的信息解析出來,包括發送端IP地址、發送端端口號、數據長度和數據內容等信息。
-
接收端根據發送端的IP地址和端口號,將數據傳輸到相應的應用程序中進行處理。
UDP知識要點
- UDP網絡通信本質不區分客戶端和服務端,在實際應用中,通常會將發送數據的一方稱為客戶端,將接收數據的一方稱為服務端。
- 在實際應用中,客戶端通常是發送請求的一方,服務端通常是提供服務的一方。例如,在客戶端與服務端之間進行網絡游戲通信時,客戶端會向服務端發送游戲請求,服務端會接收請求并處理,然后再將處理結果發送回客戶端。在這種情況下,客戶端和服務端的角色是明確的。
- UDP協議可以直接通過對方IP地址和端口號發送數據,而不需要像TCP協議那樣需要先建立連接。
- 在UDP協議中,發送數據時需要指定目標主機的IP地址和端口號,數據直接發送到目標主機。接收數據時,可以通過綁定本地IP地址和端口號來指定接收數據的地址和端口號,然后等待數據的到來。當有數據到達時,就可以直接從數據包中獲取發送方的IP地址和端口號,從而實現直接通信。
- 在UDP協議中,可以指定一個固定的端口用于發送和接收數據,也可以讓操作系統自動選擇一個空閑端口。
- 在發送UDP數據時,可以指定源端口和目標端口。如果指定了源端口,那么每次發送數據時就會使用該端口。如果未指定源端口,操作系統會自動選擇一個空閑端口,然后發送數據。在接收UDP數據時,可以指定一個固定的端口來接收數據。如果未指定端口,操作系統會自動選擇一個空閑端口來接收數據。
socket類的使用
- 參看python之TCP的網絡應用程序開發的socket類的使用部分的內容
- 栗子
- 創建UDP套接字對象:
import socket# 創建UDP套接字對象 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- 綁定本地IP地址和端口號:
# 綁定本地IP地址和端口號 local_addr = ('127.0.0.1', 8888) udp_socket.bind(local_addr)
- 發送UDP數據:
# 發送UDP數據 dest_addr = ('127.0.0.1', 9999) send_data = 'Hello, UDP!' udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
- 接收UDP數據:
# 接收UDP數據 recv_data, remote_addr = udp_socket.recvfrom(1024) print('Received from %s:%s' % remote_addr) print(recv_data.decode('utf-8'))
- 關閉UDP套接字對象:
# 關閉UDP套接字對象 udp_socket.close()
UDP發送數據開發流程分析
- 服務端:
- 創建UDP套接字對象
- 綁定本地IP地址和端口號
- 接收UDP數據
- 發送UDP數據
- 關閉UDP套接字對象
- 客戶端:
- 創建UDP套接字對象
- 發送UDP數據
- 接收UDP數據
- 關閉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()