UDP聊天器02 使用单双工模式收发数据

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的时候,会与绑定的端口有冲突
解决:将端口绑定信息写在主函数下就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值