UDP聊天器02 使用半双工模式收发数据
我们通过同一个套接字可以实现收和发两个操作,具体代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
import socket
def send_msg(udp_socket):
ip = input('请输入ip地址:')
port = int(input('请输入端口号:'))
msg = input('请输入要发送的内容:')
udp_socket.sendto(msg.encode('gbk'), (ip, port))
def recv_msg(udp_socket):
recv_data = udp_socket.recvfrom(1024)
print('[%s:%s]:%s' % (recv_data[1][0], recv_data[1][1], recv_data[0].decode('gbk')))
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
local_addr = ('', 6666)
udp_socket.bind(local_addr)
# 循环接收或发送udp信息
while True:
op = int(input('请输入操作:(0:接收数据,1:发送数据,2:exit)'))
if op == 0:
recv_msg(udp_socket)
elif op == 1:
send_msg(udp_socket)
elif op == 2:
break
else:
print('请输入正确的字符!')
if __name__ == "__main__":
main()
验证:
1)发送数据
在网络调试助手中,可以看到该消息已经收到
2)接收数据
发送5次3字节的数据。
可以看到当输入0接收数据时,接收的数据会以队列的形式传输给套接字,因此,后面传入的数据会储存在内存当中,所以,这个机制是一个很大的bug,当有黑客扫描服务器端口之后,不断往udp的端口传输巨型文件,假如不是一次性接收完数据,会导致内存被占用,有效数据无法传入。
遇见的问题
OSError: [WinError 10022] An invalid argument was supplied
原因是第一次写代码的时候,将端口绑定信息写在了recv_msg的函数下,而当套接字sendto的时候,主机会随机选定一个随机端口来回传数据,而再调用recv_msg的时候,会与绑定的端口有冲突
解决:将端口绑定信息写在主函数下就可以了。