我正在尝试用 Python 编写一个聊天应用程序作为学校项目。它应该从服务器接收消息,同时,它还应该能够向该服务器发送消息。为了做到这一点,我创建了两个线程:一个等待传入的消息,另一个接收我的输入以发送出去。问题是它无法打印来自服务器的消息,因为另一个线程总是要求输入。有没有办法让消息接收线程在输入函数要求输入时打印传入的消息?下面是代码中比较麻烦的部分:def sendmsg(conn): while True: msg=input("Your message: ") conn.send(bytes(msg,"utf-8"))def getmsg(conn): while True: data=conn.recv(1024) print(data.decode("utf-8"))def server(): soket=socket.socket(socket.AF_INET, socket.SOCK_STREAM) soket.bind((HOST,PORT)) soket.listen() print("Listining") conn, addr = soket.accept() print("Connection established!") send = threading.Thread(target = sendmsg(conn)) get = threading.Thread(target = getmsg(conn)) get.start() send.start()
1 回答
莫回无
TA贡献1865条经验 获得超7个赞
基本问题在于以下两行:
send = threading.Thread(target = sendmsg(conn))
get = threading.Thread(target = getmsg(conn))
Python 中的函数对象sendmsg和调用该对象的结果之间存在很大差异sendmsg(conn)。
该Thread对象send永远不会被创建,更不用说启动了,因为您尝试传入的参数是 call 的结果sendmsg(conn),但该函数永远不会返回。那时您已经有效地进入了一个无限循环,总是在主线程中要求用户输入。
相反,您应该传入sendmsg函数对象,并使用args参数Thread来让它知道您想在调用时传入一个额外的参数。这同样适用于getmsg:
send = threading.Thread(target=sendmsg, args=(conn,))
get = threading.Thread(target=getmsg, args=(conn,))
小心在 中包含逗号args=(conn,),否则参数不会被解释为元组。如果您愿意,可以改用列表:args=[conn]。
添加回答
举报
0/150
提交
取消