我正在尝试使用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()
答案 0 :(得分:0)
基本问题在于以下两行:
send = threading.Thread(target = sendmsg(conn))
get = threading.Thread(target = getmsg(conn))
Python中的函数对象sendmsg
与调用该对象sendmsg(conn)
的结果之间存在很大差异。
Thread
对象send
永远不会被创建,更不用说启动了,因为您要传递的参数是调用sendmsg(conn)
的结果,但是该函数永不返回。此时,您实际上已经进入了无限循环,总是在主线程中要求用户输入。
相反,您应该传递sendmsg
函数对象,并在args
中使用Thread
参数,以使其知道您要在传递参数时附加一个参数被叫。 getmsg
同样如此:
send = threading.Thread(target=sendmsg, args=(conn,))
get = threading.Thread(target=getmsg, args=(conn,))
请小心在args=(conn,)
中包含逗号,否则该参数将不会被解释为元组。如果您愿意,可以改用列表:args=[conn]
。