summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDenis Bilenko <denis@ag-projects.com>2008-10-24 19:31:10 +0700
committerDenis Bilenko <denis@ag-projects.com>2008-10-24 19:31:10 +0700
commitddc8073c679706ecfab72d89973f4830e2fcdefa (patch)
tree78faf840b2214627f53055ceaee5617cd7fbd941 /examples
parent19a326c401362f64f00fae668542e46db81d5261 (diff)
downloadeventlet-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.py73
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()