day27_udp协议
1、udp协议
UDP是一种不可靠的传输协议,
1)不需要建立双向管道。
2)不会粘包
3)客户端给服务端发送数据,不需要等待服务端返回接收成功
3)数据容易丢失,数据不安全。
2、基于udp协议的套接字编程
2.1 简单使用
# 客户端.py
import socket
client = socket.socket(type=socket.SOCK_DGRAM) # 参数SOCK_DGRAM代表UDP
server_ip_port = ('127.0.0.1', 9527) # 获取服务器套接字
client.sendto(b'hello', server_ip_port) # 一次性发送多个数据包
client.sendto(b'hello', server_ip_port)
client.sendto(b'hello', server_ip_port)
client.sendto(b'hello', server_ip_port)
client.sendto(b'hello', server_ip_port)
# 服务端.py
import socket
server = socket.socket(type=socket.SOCK_DGRAM) # 参数SOCK_DGRAM代表UDP
server.bind( ('127.0.0.1', 9527) ) # 服务器需要绑定套接字ip+port
msg, addr = server.recvfrom(1024) # 可以一次接收多个数据
msg1, addr1 = server.recvfrom(1024)
msg2, addr2 = server.recvfrom(1024)
print(msg, msg1, msg2)
2.2 基于UDP实现qq聊天室
# 服务端.py
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 10086))
while True:
msg, addr = server.recvfrom(1024)
msg1, addr1 = server.recvfrom(1024)
msg2, addr2 = server.recvfrom(1024)
print(addr)
print(msg)
print(addr1)
print(msg1)
print(addr2)
print(msg2)
send_msg = input('统一回复:').encode('utf-8')
server.sendto(send_msg, addr)
server.sendto(send_msg, addr1)
server.sendto(send_msg, addr2)
# 客户端.py
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_ip_port = ('127.0.0.1', 10086)
while True:
msg = input(f'客户端:').encode('utf8')
client.sendto(msg, server_ip_port)
# msg_recv = client.recv(1024) # 只接收消息
msg_recv,addr = client.recvfrom(1024) # recvfrom接收的是消息和地址,是一个元组
print(f'服务端:{msg_recv.decode("utf8")}')