环境:ubuntu

语言:python

问题:使用多线程并发进行udp进行会话时出现: [Errno 9] Bad file descriptor错误

原因:

reason:

  It could be that you are closing the client socket before the thread gets a chance to run, or it could be that your thread is improperly setup.

解决:并发线程之后不能紧接着就是udp_socket.close()语句,要么增加时间限制:time.sleep(99999)

要么将udp_socket.close()移动到线程调用的函数或方法中,再根据用户操作执行udp_socket.close()语句

代码:

部分注释删除了

import socket
import threading


def send_msg(udp_socket, dest_addr, sys_code_type):
    while True:
        send_date = input("请输入要发送的内容")
        if send_date == "exit":
            udp_socket.close()
        else:
            udp_socket.sendto(send_date.encode(sys_code_type), dest_addr)


def recive_msg(udp_socket, sys_code_type):
    while True:
        recv_data = udp_socket.recvfrom(1024)
        recv_msg = recv_data[0] 
        send_addr = recv_data[1]
        if recv_msg.decode(sys_code_type) == "exit":
            print("对方正在退出会话......")
            udp_socket.close()
        else:
            print("%s: %s" % (str(send_addr), recv_msg.decode(sys_code_type)))


def check_sys():
    while True:
        sys_type = input("请选择发送方的操作体统类型【1】windows【2】UNIX or Linux:")
        if sys_type == "1":
            sys_code_type = "dbk"
            break
        elif sys_type == "2":
            sys_code_type = "utf-8"
            break
        else:
            print("输入有误,重新输入")
    return sys_code_type


def get_local_addr():
    local_ip = input("请输入本机的ip地址:")
    local_port = int(input("请输入本机联机使用的进程端口:"))
    local_adds = (local_ip, local_port)
    return local_adds


def get_dest_addr():
    dest_ip = input("请输入对方的ip地址:")
    dest_port = int(input("请输入对方联机使用的进程端口:"))
    dest_addr = (dest_ip, dest_port)
    return dest_addr


def main():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    local_addr = get_local_addr()
    udp_socket.bind(local_addr)
    dest_addr = get_dest_addr()
    sys_code_type = check_sys()

    # 3:下面的代码重构,实现收发一起
    # 3.1:创建并发
    th_recv = threading.Thread(target=recive_msg, args=(udp_socket, sys_code_type))
    th_send = threading.Thread(target=send_msg, args=(udp_socket, dest_addr, sys_code_type))
    # 3.2:开始并发
    th_recv.start()
    th_send.start()

if __name__ == "__main__":
    main()

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐