[Twisted-Python] Asynchronicity

Simon Pickles sipickles at hotmail.com
Sat Jun 9 09:09:29 MDT 2007


Hi,

I have managed to get a simple server going. It seems to accept multiple
connections correctly.

I am a little puzzled as to how to achieve an asynchonous application
using twisted. Twisted itself seems asynchronous, but my code is blocked
by the call:

reactor.run()

Is there anyway I can return from the reactor to run other code, like
GUI stuff, or other processing?

My code:

import GUI
from zope.interface import Interface
from twisted.internet import reactor
from twisted.protocols import basic
from twisted.internet.protocol import Protocol, Factory

class CNetwork(basic.LineReceiver):
    def connectionMade(self):
        GUI.Print("New Client: %s" % self.transport.getPeer().host)
        self.send = lambda x: self.transport.write(x+"\r\n")
##        if self.factory.server_data:
##            self.send("\r\n".join(self.factory.server_data))
##        else:
##            self.send("You are logged in")
        GUI.Print("Entering loop for client %s" %
self.transport.getPeer().host)

    def connectionLost(self, reason):
        GUI.Print( "%s has closed the connection" %
self.transport.getPeer().host )

    def dataReceived(self, data):
        data = data.strip()
        if not data:
            self.transport.loseConnection()
            return
        GUI.Print("%s says %r" % (self.transport.getPeer().host,data))
        self.transport.write("You said: %r\r\n" % data )
       ## self.factory.server_data.append(data + "~~")
        GUI.Print("Ready to receive more data")

class CNetworkFactory(Protocol):
    factory = Factory()
    factory.protocol = CNetwork
    def __init__(self, max_clients):
        self.max_clients = max_clients
        self.connected_clients = 0
        self.server_data = []

    def doStart(self):
        GUI.Print("Factory started -- server is waiting for a connection")
    def doStop(self):
        GUI.Print("Factory stopped -- server is now closed")

    def buildProtocol(self, addr):
        GUI.Print("Connection attempt....")
        return CNetwork()

def main():

    reactor.listenTCP(14500, CNetworkFactory(max_clients = 2))
    reactor.run()

if __name__ == "__main__":
    main()

##DO SOMETHING ELSE HERE!


###################################

Thanks for your help

_________________________________________________________________
The next generation of Hotmail is here! http://www.newhotmail.co.uk





More information about the Twisted-Python mailing list