环境: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()