UDP,用户数据报协议。它是无连接的,面向消息的,提供高效率服务,但该服务并不保证数据传输的可靠性,数据有可能在传输的过程中丢失或出现数据重复,且无法保证数据顺序的接收。它不会使用合并优化算法,由于UDP支持的一对多的模式,所以接收端的套接字缓冲区(skbuff)采用了链式结构记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收来说,容易进行分区处理。面向消息的通信是有消息保护边界的。
客户端:
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)) res,server_addr=client.recvfrom(1024) print(res.decode('utf-8'))
服务端:
import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议 server.bind(('127.0.0.1',8080)) while True: client_data,client_addr=server.recvfrom(1024) server.sendto(client_data.upper(),client_addr)
因为它是没有连接的,更没半连接池。所以可以有多个客户端在不同的时间与其通信。因为计算机的处理速度快,给人一种并发处理的错觉。
因为UDP包有报头,明确的区分了消息的边界,所以他不会产生粘包。
客户端:
import socket client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议 client.sendto(b'hello',('127.0.0.1',8080)) client.sendto(b'world',('127.0.0.1',8080)) client.sendto(b'monicx',('127.0.0.1',8080))
服务端:
import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议 server.bind(('127.0.0.1',8080)) res1,client_addr1=server.recvfrom(1024) print(res1) res2,client_addr2=server.recvfrom(1024) print(res2) res3,client_addr3=server.recvfrom(1024) print(res3)
运行结果就是没有粘包: