UDP编程
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协议