Internet 協議集支持一個無連接的傳輸協議,該協議稱為用戶資料報協議(UDP,User Datagram Protocol),
UDP 為應用程式提供了一種無需建立連接就可以發送封裝的 IP 資料包的方法,
udp網路程式模型圖,

接下來,我們用 python 代碼實作udp資料的發送和接收,
一、udp網路程式,發送資料
流程:
- 創建客戶端套接字
- 發送資料
- 關閉套接字
import socket
def main():
# 1.創建一個udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.準備接收方的地址
# 192.168.65.149 表示目的地ip
# 30000 表示目的地埠
udp_socket.sendto("hello".encode("utf-8"), ("192.168.65.149", 30000))
# 3.關閉套接字
udp_socket.close()
if __name__ == "__main__":
main()
sendto 的第一個引數需要一個位元組型別,所以需要編碼一下,不能單單傳一個字串,
我們為了驗證寫的程式是否正確,可以使用網路除錯助手來驗證,

在上面的例子中,網路除錯助手里的“本機主機地址”應該填寫作為服務方電腦的ip地址,我們這里在一臺電腦上測驗,所以寫了代碼里的ip地址,
但是大家要理解成是另一臺服務器的電腦的ip,
埠就選擇一個號大一點的,不要占用主流埠,
二、udp網路程式,接收資料
流程:
- 創建套接字
- 系結本地自己的資訊
- 接收資料
- 關閉套接字
接收資料最重要的一步,就是要系結埠,
import socket
def main():
# 1.創建一個udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.系結本地的相關資訊,如果一個網路程式不系結,則系統會隨機分配
# 30000 表示本地的埠 ip一般不用寫
local_addr = ("", 30000)
udp_socket.bind(local_addr)
# 3. 等待接收對方發送的資料
recv_data = https://www.cnblogs.com/studyming/p/udp_socket.recvfrom(1024)
# 1024表示本次接收的最大位元組數
# 6. 顯示對方發送的資料
# 接收到的資料recv_data是一個元組
# 第1個元素是對方發送的資料
# 第2個元素是對方的ip和埠
print(recv_data[0].decode('gbk'))
print(recv_data[1])
# 3.關閉套接字
udp_socket.close()
if __name__ == "__main__":
main()
將收到的資料解碼時要注意,和客戶端編碼的格式要一樣,
在選擇UDP作為傳輸協議時必須要謹慎,
在網路質量令人十分不滿意的環境下,UDP協議資料包丟失會比較嚴重,
但是由于UDP的特性:它不屬于連接型協議,因而具有資源消耗小,處理速度快的優點,所以通常音頻、視頻和普通資料在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響,
比如我們聊天用的ICQ和QQ就是使用的UDP協議,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/5966.html
標籤:Python
