UDP协议实现socket
UDP协议的特点
- UDP是无链接的,先启动哪一端都不会报错(不可靠)
- UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到
- 因为自带包头,所以不会出现粘包现象,但是多余的内容不会接收,所以会丢包。
UDP的使用
- UPD协议一般不用于传输大数据。
- UDP套接字虽然没有粘包问题,但是不能替代TCP套接字,因为UPD协议有一个缺陷:如果数据发送的途中,数据丢失,则数据就丢失了,而TCP协议则不会有这种缺陷,因此一般UPD套接字用户无关紧要的数据发送,例如qq聊天。
实现简单通信循环聊天
# server
import socket
# 指定连接协议为udp协议
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8080))
# 绑定地址后即可首发数据,无需监听
while True:
# recvfrom接收传来的信息和client端地址
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf8'))
info = input('>>>')
info = '来自主机的消息:'+info
# 发送数据的时候要带上addr
sk.sendto(info.encode('utf8'),addr)
sk.close()
# client1
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
# 指定收发数据的server端地址
addr = ('127.0.0.1',8080)
while True:
info = input('大哥:')
info = '来自大哥的消息:' + info
sk.sendto(info.encode('utf8'),addr)
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf8'))
sk.close()
# client2
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
# 指定收发数据的server端地址
addr = ('127.0.0.1',8080)
while True:
info = input('二哥:')
info = '来自二哥的消息:' + info
sk.sendto(info.encode('utf8'),addr)
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf8'))
sk.close()