为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中键入输入时在控制台上打印

在 Python 中键入输入时在控制台上打印

DIEA 2021-08-05 18:28:28
我正在尝试用 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]。


查看完整回答
反对 回复 2021-08-05
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信