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
66
67
68
69
70
71
72
73
74
75
76
77
|
from app.fanoutclient import FanoutClient
from app.terminatorscanner import TerminatorScannerBasic
import pyuv
import random
class Hopper(FanoutClient):
def __init__(self, address, port):
super(Hopper, self).__init__(address)
self.server_listen_port = port
def on_connected(self):
self.subscribe('join')
self.subscribe('leave')
self.announce('join', 'hopper|%s' % self.server_listen_port)
def disconnect(self):
def after_announce():
super(Hopper, self).disconnect()
self.announce("leave", 'hopper', callback=after_announce)
loop = pyuv.Loop.default_loop()
ihandler = TerminatorScannerBasic('\n')
clients = []
ports = []
def on_connection(server, error):
client = pyuv.TCP(server.loop)
server.accept(client)
clients.append(client)
client.start_read(on_read)
def on_read(client, data, error):
if data is None:
client.close()
clients.remove(client)
return
ihandler.handle_read(data)
while ihandler.incoming:
msg = ihandler.incoming.pop(0)
cmd, data = msg.split(' ', 1)
if cmd == 'hello':
_, port = data.split()
ports.append(port)
print 'hello from %s' % port
port = random.randint(10000, 50000)
server = pyuv.TCP(loop)
server.bind(('127.0.0.1', port))
server.listen(on_connection)
def on_timer(timer):
timer.stop()
port = random.choice(ports)
print 'sending hop command to port %s' % port
def on_connected(handle, error):
handle.write('hop hop\n', on_written)
def on_written(handle, error):
handle.close()
fanout_client.disconnect()
server.close()
handle = pyuv.TCP(timer.loop)
handle.connect(('127.0.0.1', int(port)), on_connected)
timer = pyuv.Timer(loop)
timer.start(on_timer, 2, 0)
fanout_client = Hopper(('127.0.0.1', 9898), port)
fanout_client.connect()
loop.run()
|