网络编程(十)——基于UDP协议的套接字

书读的越多而不加思考,你就会觉得你知道得很多;而当你读书而思考得越多的时候,你就会越清楚地看到,你知道得很少。

导读:本篇文章讲解 网络编程(十)——基于UDP协议的套接字,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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] 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。

网络编程(十)——基于UDP协议的套接字

如果是Linux系统,不会报错,它会按照服务端设置的接收量来接收数据:

例如:客户端发送b’hello’,服务端设置接收数据最多为一个字节(recvfrom(1)),那么服务端收到的数据就是b’h’

所以,使用UDP协议通讯会有消息不见的现象,比如QQ

3、浏览器查询数据时一般也是基于UDP通讯,毕竟用UDP效率高,即使出现数据丢失问题(比如我没有查到想要的信息),那我再查询一次就行。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122880.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!