UDP協議沒有粘包問題,可是緩衝區大小要足夠裝數據包大小,建議不要超過 512python
服務端:服務器
# 服務端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 數據報協議-》udp
server.bind(('127.0.0.1', 8080))
# OSError: 一個在數據報套接字上發送的消息大於內部消息緩衝區或其餘一些網絡限制,或該用戶用於接收數據報的緩衝區比數據報小。
data, client_addr = server.recvfrom(1) # b'hello' ==> b'h'
print('第一次:', client_addr, data)
data, client_addr = server.recvfrom(1024) # b'world' ==> b'world'
print('第二次:', client_addr, data)
# data, client_addr = server.recvfrom(1024)
# print('第三次: ', client_addr, data)
server.close()
客戶端:網絡
# 客戶端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 數據報協議 ==> UDP協議
client.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8080))
client.sendto('world'.encode('utf-8'), ('127.0.0.1', 8080))
# client.sendto(''.encode('utf-8'), ('127.0.0.1',8080))
client.close()
基於UDP協議通訊的套接字併發
服務器:
1)建立套接字描述符(socket)
2)設置服務器的 IP 地址和端口號(須要轉換爲網絡字節序的格式)
3)將套接字描述符綁定到服務器地址(bind)
4)從套接字描述符讀取來自客戶端的請求並取得客戶端的地址(recvfrom)
5)向套接字描述符寫入應答併發送給客戶端(sendto)
6)回到第 4 步等待讀取下一個來自客戶端的請求socket
客戶端:
1)建立套接字描述符(socket)
2)設置服務器的 IP 地址和端口號(須要轉換爲網絡字節序的格式)
3)向套接字描述符寫入請求併發送給服務器(sendto)
4)從套接字描述符讀取來自服務器的應答(recvfrom)
5)關閉套接字描述符(close)spa
服務端:code
# 服務端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(("127.0.0.1", 8080))
while True:
data,client_addr = server.recvfrom(1024)
print(data.decode("utf-8"))
server.sendto(data.upper(), client_addr)
server.close()
客戶端:server
# 客戶端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
msg = input("請發送: ").strip()
client.sendto(msg.encode("utf-8"), ("127.0.0.1", 8080))
data, server_addr = client.recvfrom(1024)
print(data.decode("utf-8"))
對於 UDP 協議,客戶端發送空沒有問題,由於 UDP 協議又叫數據報協議,自帶報頭,在發送空的時候自動將報頭信息發送過去,因此服務端也能接收數據。同時 UDP 協議能夠同時處理多個客戶端,是由於 CPU 的處理速度快,給人感受像是在同時處理blog