猿问

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

我正在尝试用 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()


DIEA
浏览 158回答 1
1回答

莫回无

基本问题在于以下两行: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]。
随时随地看视频慕课网APP

相关分类

Python
我要回答