简体   繁体   中英

Twisted chat client only receives message directly after sending a message?

I am writing a simple command line chat program with the Twisted framework. In three separate command lines I have opened my chat server and two clients (see code below).

The problem I am having is that if I send a message from one client the next client won't receive it. However once that other client sends its own message it receives the message from the other client. Hope this is clear.

Thanks

Server:

from twisted.protocols import basic

class MyChat(basic.LineReceiver):
    def connectionMade(self):
        print "Got new client!"
        self.factory.clients.append(self)

    def connectionLost(self, reason):
        print "Lost a client!"
        self.factory.clients.remove(self)

    def lineReceived(self, line):
        data = repr(line)
        print data
        for c in self.factory.clients:
            c.message(data)

    def message(self, message):
        self.transport.write(message + '\r\n')



from twisted.internet import reactor, protocol
from twisted.application import service, internet

factory = protocol.ServerFactory()
factory.protocol = MyChat
factory.clients = []
reactor.listenTCP(8042, factory)
reactor.run()

Client:

from twisted.protocols import basic


# a client protocol

class EchoClient(basic.LineReceiver):

    def sendData(self):
        data = raw_input("> ")
        if data:
            print "sending %s...." % data
            self.transport.write(data + "\r\n")
        else:
            self.transport.loseConnection()

    def connectionMade(self):
        self.username = raw_input("Name: ")
        self.sendData()

    def lineReceived(self, data):
        print data
        self.sendData()

    def connectionLost(self, reason):
        print "connection lost"

class EchoFactory(protocol.ClientFactory):
    protocol = EchoClient

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost - goodbye!"
        reactor.stop()


# this connects the protocol to a server runing on port 8000
def main():
    f = EchoFactory()
    reactor.connectTCP("localhost", 8042, f)
    reactor.run()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()

Your sendData is blocking. You can think of Twisted as a big while True loop that checks each cycle whether or not there are things to do. So once you enter the sendData function and call raw_input you in effect are stopping your whole program.

Have a look at this question

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM