(python)基于UDP协议通信的套接字

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)

运行结果就是没有粘包:






猜你喜欢

转载自blog.csdn.net/miaoqinian/article/details/80053637
今日推荐