TCP和UDP协议传输对比
- TCP协议传输数据可靠,TCP传输数据后,如果收到接收方回应消息,则会在本机缓存中删除已发送消息;如果没有收到接收方回应消息,则会利用缓存继续发送消息。
- UDP协议传输数据相对来说不可靠,发送方只要发出消息即完成任务。但是UDP传输无需建立三次握手链接,开销较小,也不需要等待对方回应,发送效率很高。
模拟UDP通讯
服务端代码
# 不建议使用这种导入方式,因为导入一个模块的全部内容占用较大空间
# 对于socket编程来说,其中会用到大量socket函数,全部导入还是会少写许多代码
from socket import *
# socket.SOCK_DGRAM -> UDP协议又称数据报协议
server = socket(AF_INET,SOCK_DGRAM)
server.bind(("127.0.0.1",8080))
# UDP无需建立链接
# 通信循环
while True:
data,client_addr = server.recvfrom(1024)
print(data)
server.sendto(data.upper(),client_addr)
server.close()
客户端代码
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
# 通信循环
while True:
msg = input(">>:").strip()
client.sendto(msg.encode("utf-8"),("127.0.0.1",8080))
data,server_addr = client.recvfrom(1024)
print(data,server_addr)
client.close()
UDP通讯特点
1、UDP协议不会粘包
2、客户端发送的数据量大于服务端接收限制时,Windows系统会报错:
OSError: [WinError 10040] 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。
如果是Linux系统,不会报错,它会按照服务端设置的接收量来接收数据:
例如:客户端发送b'hello',服务端设置接收数据最多为一个字节(recvfrom(1)),那么服务端收到的数据就是b'h'
所以,使用UDP协议通讯会有消息不见的现象,比如QQ
3、浏览器查询数据时一般也是基于UDP通讯,毕竟用UDP效率高,即使出现数据丢失问题(比如我没有查到想要的信息),那我再查询一次就行。