基于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))