基于udp協議通信的套接字
服務端
1 from socket import * 2 3 server = socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM=>數據報協議 4 server.bind(('127.0.0.1', 8080)) 5 6 print('start....') 7 while True: 8 data, client_addr = server.recvfrom(1024) # (b'hello', ('127.0.0.1', 49318)) 9 server.sendto(data.upper(), client_addr) 10 11 server.close()
?
?
客戶端
1 from socket import * 2 3 client = socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM=>數據報協議 4 5 while True: 6 msg = input('>>: ').strip() 7 client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080)) 8 data, server_addr = client.recvfrom(1024) 9 print(data) 10 11 client.close()
?
?
數據報協議的特點1
當發送的數據報大于接收數據報的緩沖區大小時:
在windows系統: 接收端會拋出異常
在Linux系統: 接收端不會拋出異常, 會丟棄掉多余的數據
?
服務端
1 from socket import * 2 3 server = socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM=>數據報協議 4 server.bind(('127.0.0.1', 8081)) 5 6 server.recvfrom(1)
>>>OSError: [WinError 10040] 一個在數據報套接字上發送的消息大于內部消息緩沖區或其他一些網絡限制,或該用戶用于接收數據報的緩沖區比數據報小。
?
客戶端
1 from socket import * 2 3 client = socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM=>數據報協議 4 5 client.sendto(b'hello', ('127.0.0.1', 8081))
?
?
數據報協議的特點2
UDP協議沒有粘包問題
UD協議能夠穩定傳輸數據的最大數據量為512Bytes
?
服務端
1 from socket import * 2 3 server = socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM=>數據報協議 4 server.bind(('127.0.0.1', 8081)) 5 6 data1 = server.recvfrom(1024) 7 print('第一次接收: ', data1) 8 data2 = server.recvfrom(1024) 9 print('第二次接收: ', data2) 10 data3 = server.recvfrom(1024) 11 print('第三次接收: ', data3)
>>>第一次接收: (b'hello', ('127.0.0.1', 55249))
>>>第二次接收: (b'world', ('127.0.0.1', 55249))
>>>第三次接收: (b'egon', ('127.0.0.1', 55249))
?
客戶端
1 from socket import * 2 3 client = socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM=>數據報協議 4 5 client.sendto(b'hello', ('127.0.0.1', 8081)) 6 client.sendto(b'world', ('127.0.0.1', 8081)) 7 client.sendto(b'egon', ('127.0.0.1', 8081))
?