~exarkun/+junk/training

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()