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

时间:2018-11-02 19:01:37

标签: python python-3.x multithreading

我正在尝试使用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 个答案:

答案 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]