Reputation: 745
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()
Upvotes: 3
Views: 1206
Reputation: 1802
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
Upvotes: 1