我正在嘗試用 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
提交
取消