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)
运行结果就是没有粘包: