diff options
author | Denis Bilenko <denis@ag-projects.com> | 2008-10-24 19:31:10 +0700 |
---|---|---|
committer | Denis Bilenko <denis@ag-projects.com> | 2008-10-24 19:31:10 +0700 |
commit | ddc8073c679706ecfab72d89973f4830e2fcdefa (patch) | |
tree | 78faf840b2214627f53055ceaee5617cd7fbd941 /examples | |
parent | 19a326c401362f64f00fae668542e46db81d5261 (diff) | |
download | eventlet-ddc8073c679706ecfab72d89973f4830e2fcdefa.tar.gz |
added twisted_ex3_server.py: an example on using twisted server and coroutines together
Diffstat (limited to 'examples')
-rw-r--r-- | examples/twisted_ex3_server.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/examples/twisted_ex3_server.py b/examples/twisted_ex3_server.py new file mode 100644 index 0000000..fc0baf4 --- /dev/null +++ b/examples/twisted_ex3_server.py @@ -0,0 +1,73 @@ +from twisted.internet import pollreactor; pollreactor.install() +from twisted.internet.protocol import Factory +from twisted.internet import reactor +from twisted.protocols import basic +from twisted.internet.error import ConnectionDone + +from eventlet.api import spawn, get_hub +from eventlet.channel import channel + +class LineOnlyReceiver(basic.LineOnlyReceiver): + + def __init__(self, channel): + self.channel = channel + + def lineReceived(self, line): + spawn(self.channel.send, line) + + def connectionLost(self, reason): + self.channel.send_exception(reason.value) + + +class line_only_receiver: + + def __init__(self, protocol, channel): + self.protocol = protocol + self.channel = channel + + def readline(self): + return self.channel.receive() + + def send(self, data): + self.protocol.transport.write(data) + + def sendline(self, line): + self.protocol.sendLine(line) + + # iterator protocol: + + def __iter__(self): + return self + + def next(self): + try: + return self.readline() + except ConnectionDone: + raise StopIteration + + +class MyFactory(Factory): + protocol = LineOnlyReceiver + + def __init__(self, handler): + self.handler = handler + + def buildProtocol(self, addr): + ch = channel() + p = self.protocol(ch) + p.factory = self + spawn(self.handler, line_only_receiver(p, ch)) + return p + +def handler(linerecv): + peer = linerecv.protocol.transport.getPeer() + print 'new connection from %s' % (peer, ) + try: + for line in linerecv: + print 'received from %s: %s' % (peer, line) + print peer, 'connection done' + except Exception, ex: + print peer, ex + +reactor.listenTCP(8007, MyFactory(handler)) +get_hub().switch() |