Le client de chat tordu ne reçoit le message que directement après l’envoi d’un message?

J’écris un simple programme de discussion en ligne de commande avec le framework Twisted. Dans trois lignes de commande distinctes, j’ai ouvert mon serveur de discussion et deux clients (voir le code ci-dessous).

Le problème que j’ai est que si je envoie un message d’un client, le client suivant ne le recevra pas. Cependant, une fois que l’autre client envoie son propre message, il reçoit le message de l’autre client. J’espère que c’est clair.

Merci

Serveur:

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() 

Votre sendData bloque. Vous pouvez penser à Twisted comme une grande boucle while True qui vérifie chaque cycle, qu’il y ait ou non des choses à faire. Donc, une fois que vous entrez dans la fonction sendData et raw_input vous appelez raw_input vous raw_input tout votre programme.

Regardez cette question