def EBRPC_ReplicationServer(port, ebrpc): factory = protocol.Factory() factory.children = set() factory.protocol = RepeaterProtocol def render(request): request.content.seek(0, 0) if hasattr(request.content, 'getvalue'): c = request.content.getvalue() for child in factory.children: # don't worry, write is non-blocking child.transport.write(ebencode.make_int(len(c))) child.transport.write(c) else: c = buffer.Buffer() while True: b = request.content.read(100000) if len(b) == 0: break c.write(b) c = str(c) for child in factory.children: # don't worry, write is non-blocking child.transport.write(ebencode.make_int(len(c))) child.transport.write(c) request.content.seek(0, 0) ebrpc.render = decorate_func(render, ebrpc.render) reactor.listenTCP(port, factory)
def create_serversocket(self, port, bind=''): s = SocketRequestProxy(port, bind, 'tcp') factory = ConnectionFactory(self, outgoing=False) try: s.listening_port = reactor.listenTCP(s.port, factory, interface=s.bind) except error.CannotListenError, e: if e[0] != 0: raise e.socketError else: raise
if __name__ == '__main__': from BTL.reactor_magic import reactor ## server from BTL import twisted_ebrpc, replication from twisted.web import server class Server(twisted_ebrpc.EBRPC): def ebrpc_ping(self, *args): print 'server got: ping(%s)' % repr(args) assert args == (1002,) return args r = Server() replication.EBRPC_ReplicationServer(9000, r) reactor.listenTCP(7080, server.Site(r)) ## listener 1 (simple) from twisted.internet.protocol import ClientFactory from BTL import replication from BTL.ebencode import ebdecode class PrintingReplicationListener(replication.ReplicationListener): def payloadReceived(self, payload): payload = ebdecode(payload) print 'listener got:', payload assert payload == {'a': [[1002], {}], 'q': 'ping', 'y': 'q'} factory = ClientFactory() factory.protocol = PrintingReplicationListener reactor.connectTCP('127.0.0.1', 9000, factory)
if __name__ == '__main__': from BTL.reactor_magic import reactor ## server from BTL import twisted_ebrpc, replication from twisted.web import server class Server(twisted_ebrpc.EBRPC): def ebrpc_ping(self, *args): print 'server got: ping(%s)' % repr(args) assert args == (1002, ) return args r = Server() replication.EBRPC_ReplicationServer(9000, r) reactor.listenTCP(7080, server.Site(r)) ## listener 1 (simple) from twisted.internet.protocol import ClientFactory from BTL import replication from BTL.ebencode import ebdecode class PrintingReplicationListener(replication.ReplicationListener): def payloadReceived(self, payload): payload = ebdecode(payload) print 'listener got:', payload assert payload == {'a': [[1002], {}], 'q': 'ping', 'y': 'q'} factory = ClientFactory() factory.protocol = PrintingReplicationListener reactor.connectTCP('127.0.0.1', 9000, factory)