1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
from twisted.internet.defer import Deferred
from twisted.protocols.basic import NetstringReceiver
from twisted.internet.protocol import ServerFactory, ClientCreator
from twisted.internet import reactor
class RemoteMethodCalls(NetstringReceiver):
def connectionMade(self):
self.commandBuffer = []
def stringReceived(self, string):
self.commandBuffer.append(string)
if len(self.commandBuffer) == 2:
type, argument = self.commandBuffer
self.commandBuffer = []
getattr(self, "type_" + type)(argument)
def type_CALL(self, argument):
method = getattr(self, 'remote_' + argument)
result = method()
self.sendString("ANSWER")
self.sendString(result)
def type_ANSWER(self, argument):
result = self.result
self.result = None
result.callback(argument)
def callRemote(self, method):
self.result = Deferred()
self.sendString("CALL")
self.sendString(method)
return self.result
def remote_hello(self):
return "world"
def main():
server = ServerFactory()
server.protocol = RemoteMethodCalls
port = reactor.listenTCP(0, server)
client = ClientCreator(reactor, RemoteMethodCalls)
d = client.connectTCP('127.0.0.1', port.getHost().port)
def cbConnected(proto):
return proto.callRemote("hello")
d.addCallback(cbConnected)
def cbHello(result):
print "Hello result:", repr(result)
reactor.stop()
d.addCallback(cbHello)
reactor.run()
if __name__ == '__main__':
main()
|