added twisted_ex3_server.py: an example on using twisted server and coroutines together
This commit is contained in:
73
examples/twisted_ex3_server.py
Normal file
73
examples/twisted_ex3_server.py
Normal file
@@ -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()
|
Reference in New Issue
Block a user