鄙人學習筆記
文章目錄
- UDP套接字程式設計
- 服務端流程
- 舉個例子
- 用戶端流程
- 舉個例子
- TCP套接字和UDP套接字程式設計差別
UDP套接字程式設計
服務端流程
- 建立資料報套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
- 綁定位址
sockfd.bind(addr)
備注:作為服務端,必然要綁定位址的。
- 消息收發
data,addr = sockfd.recvfrom(buffersize)
功能: 接收UDP消息
參數: 每次最多接收多少位元組
傳回值:
data 接收到的内容
addr 消息發送方位址
n = sockfd.sendto(data,addr)
功能: 發送UDP消息
參數:
data 發送的内容 bytes格式
addr 目标位址
傳回值:發送的位元組數
備注:由于UDP沒有建立連接配接,是以沒有一個專門的連接配接套接字對象(一發送就知道發送給誰),是以我們需要指明目标位址。
備注:UDP不需要建立連接配接。
- 關閉套接字
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()
用戶端流程
- 建立資料報套接字
- 收發消息
- 關閉套接字
備注:依然要注意,用戶端與服務端的收發順序。若服務端先收後發,則用戶端先發後收。
舉個例子
服務端代碼:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CNxYDMzczNzIGNyUWZ1gTOyYzXwMTN1QTMyAzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
用戶端代碼:
運作服務端:
運作用戶端,并發送消息:
檢視服務端:
備注:由于是UDP協定,是以相當”自由”,可以同時接收多個用戶端發來的消息。在這裡就不示範了。
這裡,我們再更改一下服務端的recvfrom的參數,來控制一下每次最多能接收的位元組數(用戶端代碼不變)。
服務端代碼:
用用戶端發送hello world:
用戶端接收到服務端的消息:
服務端輸出:
得到5個位元組。
我們再用用戶端發送nihao:
服務端輸出:
咦?這是咋回事?咋和TCP的不太一樣?
…好吧,第一次發送的【hello world】的後面的【 world】丢失了。這是提供不可靠傳輸服務的展現。但這個是合理的,比如,用戶端A和用戶端B都向服務端send()消息,UDP協定的不可靠傳輸雖然可能會丢失消息,但不會使用戶端A發送過來的消息,顯示在用戶端B發送的消息裡面。這樣,甯願丢失消息,也不能導緻混亂。
是以,UDP套接字傳輸中,如果一次接收消息接收不完(超過最多能接收的位元組數),則會把剩下的消息(超過指定位元組數的部分)丢棄。