天天看點

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

鄙人學習筆記

文章目錄

  • ​​UDP套接字程式設計​​
  • ​​服務端流程​​
  • ​​舉個例子​​
  • ​​用戶端流程​​
  • ​​舉個例子​​
  • ​​TCP套接字和UDP套接字程式設計差別​​

UDP套接字程式設計

服務端流程

  1. 建立資料報套接字
sockfd = socket(AF_INET,SOCK_DGRAM)      
  1. 綁定位址
sockfd.bind(addr)      

備注:作為服務端,必然要綁定位址的。

  1. 消息收發
data,addr = sockfd.recvfrom(buffersize)      
功能: 接收UDP消息
參數: 每次最多接收多少位元組
傳回值:
     data  接收到的内容
       addr  消息發送方位址      
n = sockfd.sendto(data,addr)      
功能: 發送UDP消息
參數: 
    data  發送的内容 bytes格式
      addr  目标位址
傳回值:發送的位元組數
備注:由于UDP沒有建立連接配接,是以沒有一個專門的連接配接套接字對象(一發送就知道發送給誰),是以我們需要指明目标位址。      

備注:UDP不需要建立連接配接。

  1. 關閉套接字
sockfd.close()      

舉個例子

代碼:

from socket import *

#建立資料報套接字
sockfd = socket(AF_INET, SOCK_DGRAM)

#綁定位址
server_addr = ('127.0.0.1',8888)
sockfd.bind(server_addr)

#收發消息
while True:
    data,addr = sockfd.recvfrom(1024)
    print("收到的消息:",data.decode())
    sockfd.sendto(b"Thanks",addr)

#關閉套接字
sockfd.close()      

用戶端流程

  1. 建立資料報套接字
  2. 收發消息
  3. 關閉套接字

備注:依然要注意,用戶端與服務端的收發順序。若服務端先收後發,則用戶端先發後收。

舉個例子

服務端代碼:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

用戶端代碼:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

運作服務端:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

運作用戶端,并發送消息:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

檢視服務端:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

備注:由于是UDP協定,是以相當”自由”,可以同時接收多個用戶端發來的消息。在這裡就不示範了。

這裡,我們再更改一下服務端的recvfrom的參數,來控制一下每次最多能接收的位元組數(用戶端代碼不變)。

服務端代碼:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

用用戶端發送hello world:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

用戶端接收到服務端的消息:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

服務端輸出:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

得到5個位元組。

我們再用用戶端發送nihao:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

服務端輸出:

網絡程式設計(part10)--socket套接字程式設計之UDP套接字

咦?這是咋回事?咋和TCP的不太一樣?

…好吧,第一次發送的【hello world】的後面的【 world】丢失了。這是提供不可靠傳輸服務的展現。但這個是合理的,比如,用戶端A和用戶端B都向服務端send()消息,UDP協定的不可靠傳輸雖然可能會丢失消息,但不會使用戶端A發送過來的消息,顯示在用戶端B發送的消息裡面。這樣,甯願丢失消息,也不能導緻混亂。

是以,UDP套接字傳輸中,如果一次接收消息接收不完(超過最多能接收的位元組數),則會把剩下的消息(超過指定位元組數的部分)丢棄。

TCP套接字和UDP套接字程式設計差別