天天看點

Learning-Python【30】:基于UDP協定通信的套接字

UDP協定沒有粘包問題,但是緩沖區大小要足夠裝資料包大小,建議不要超過 512

服務端:

# 服務端
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 步等待讀取下一個來自用戶端的請求

用戶端:

1)建立套接字描述符(socket)

2)設定伺服器的 IP 位址和端口号(需要轉換為網絡位元組序的格式)

3)向套接字描述符寫入請求并發送給伺服器(sendto)

4)從套接字描述符讀取來自伺服器的應答(recvfrom)

5)關閉套接字描述符(close)

服務端:

# 服務端
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()
           

用戶端:

# 用戶端
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 的處理速度快,給人感覺像是在同時處理

轉載于:https://www.cnblogs.com/qiuxirufeng/p/9916648.html