线程未启动没有提示用户输入(Python)

2024-05-28 18:42:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python实现一个简单的消息传递应用程序。我已经定义了一个客户机CClient,它实例化一个CMsgGateway,然后开始一个线程,请求用户输入(而不是1)。客户情况如下:

from msginterface import CMsgGateway

class CClient():

    def __init__(self):
        self.port = 2400
        self.msgGate = CMsgGateway(self.port)
        Thread(target=self.inputMsg).start()

    def inputMsg(self):
        while 1:
            msg = input("Enter message:")
            self.msgGate.sendMsg(msg)

if __name__ == '__main__':
    cmdchat = CClient()

消息网关侦听在单独线程中接收的消息(1)。此类定义为:

from threading import Thread
import socket, struct, sys

class CMsgGateway():
    def __init__(self, port):  

        self.port = port
        print("Listening on port " + str(self.port) + ".\n")
        Thread(target=self.serve).start()

    def serve(self):
        while 1:
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.sock.bind(("", self.port))
            self.sock.listen(1)   
            self.rcvMsg()

    def rcvMsg(self):
        serverSocket, info = self.sock.accept()
        while 1:
        try:            
            buf = bytearray(4000)
            view = memoryview(buf)
            bytes = serverSocket.recv_into(view, 4000)
            if bytes:
                stx = view[0]
                Size = view[1:3]
                bSize = Size.tobytes()
                nTuple = struct.unpack(">H", bSize)
                nSize = nTuple[0]
                message = view[0:3+nSize]
                messageString = message.tobytes().decode("utf-8").strip()
                print("Received message:\n\n" + messageString)
                sys.stdout.flush()
            else:
                break
        except socket.timeout:
            break

    def sendMsg(self, msgToSend):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        host = socket.gethostname()
        self.sock.connect((host, self.port))
        self.sock.send(msgToSend.encode())
        self.sock.close()

当我运行程序时,CMsgGateway内的线程开始侦听消息。但是,据我所知,CClient内的线程,inputMsg方法没有开始(我看不到输入提示,例如,“enter message”没有显示)

有人能帮我找出这有什么问题吗?非常感谢


Tags: importselfview消息messageportdefsocket

热门问题