UDP服务端编程

UDP服务端编程流程

  • 创建socket对象。socket.SOCK_DGRAM
  • 绑定IP和Port,bind()方法
  • 传输数据
    • 接收数据,socket.recvfrom(bufsize[, flags]),获得一个二元组(string, address)
    • 发送数据,socket.sendto(string, address)发给某地址某信息
  • 释放数据
server = socket.socket(type=socket.SOCK_DGRAM)

server.bind(('0.0.0.0', 9999))  # 立即绑定一个udp端口
data = server.recv(1024)  # 阻塞等待数据
data = server.recvfrom(1024)  # 阻塞等待数据(value, (ip, port))
server.send(b'7', ('192.168.142.1', 10000))

server.close()

UDP客户端编程流程

  • 创建socket对象。socket.SOCK_DGRAM
  • 发送数据,socket.sendto(string, address)发给某地址某信息
  • 接受数据,socket。recvfrom(bufsize[, flags]),获得一个二元组(string, address)
  • 释放资源
client = socket.socket(type=socket.SOCK_DGRAM)
raddr = ('192.168.142.1', 10000)

client.connect(raddr)
client.sendto(b'8', raddr)
client.send(b'9')
data = client.recvfrom(1024)  # 阻塞等待数据(value, (ip, addr))
data = client.recv(1024)  # 阻塞等待数据

client.close()

注意:UDP是无连接协议,所以可以直有任何一端,例如客户端数据发往服务端,服务端存在与否无所谓

UDP编程中bind、connect、send、sendto、sendto、recv、recvfrom方法使用
UDP的socket对象创建后,是没有占有本地地址和端口的

方法说明
bind方法可以指定本地地址和端口addr,会立即占用
connect方法可以立即占用本地地址和端口,填充远端地址和端口raddr
sendto方法可以立即占用本地地址和端口,并把数据发往指定远端。只有有了本地绑定端口,sendto就可以向任何远端发送数据
send方法需要和connect方法配合,可以使用已经从本地端口把数据发往raddr指定的远端
recv方法需要一定要在占用了本地端口后,返回接收的数据
recvfrom方法需求一定要占用了本地端口后,返回接收的数据和对端地址的二元组

UDP协议应用

UDP是无连接协议,它基于以下假设:网络足够好 消息不会丢包 包不会乱序

但是,即使是在局域网,也不能保证不丢包,而且包的到达不一定有序

应用场景 视频、音频传输,一般来说,丢些包,问题不大,最多丢些图像、听不清话语,可以重新发话语来解决。海量采集数据,例如传感器发来的数据,丢几十,几百条数据也没有关系。DNS协议,数据内容小,一个包就能查询到结果,不存在乱序,丢包,重新请求解析

一般来说,UDP性能优于TCP,但是可靠性要求高的场合的还是要选择TCP协议