-
Notifications
You must be signed in to change notification settings - Fork 236
/
client.py
57 lines (47 loc) · 1.94 KB
/
client.py
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
import zmq
from bluesky.tools import Signal
class Client(object):
def __init__(self):
ctx = zmq.Context.instance()
self.event_io = ctx.socket(zmq.DEALER)
self.stream_in = ctx.socket(zmq.SUB)
self.poller = zmq.Poller()
self.host_id = ''
self.client_id = 0
self.sender_id = ''
# Signals
self.event_received = Signal()
self.stream_received = Signal()
def sender(self):
return self.sender_id
def connect(self):
self.event_io.connect('tcp://localhost:9000')
self.event_io.send('REGISTER')
msg = self.event_io.recv()
self.client_id = ord(msg[-1]) - 100
self.host_id = msg[:4]
print('Client {} connected to host {}'.format(self.client_id, self.host_id))
self.stream_in.setsockopt(zmq.SUBSCRIBE, b'')
self.stream_in.connect('tcp://localhost:9001')
self.poller.register(self.event_io, zmq.POLLIN)
self.poller.register(self.stream_in, zmq.POLLIN)
def receive(self):
''' Poll for incoming data from Manager, and receive if avaiable. '''
try:
socks = dict(self.poller.poll(0))
if socks.get(self.event_io) == zmq.POLLIN:
self.sender_id = self.event_io.recv()
data = self.event_io.recv_pyobj()
self.event_received.emit(data, self.sender_id)
if socks.get(self.stream_in) == zmq.POLLIN:
stream_name = self.stream_in.recv()
data = self.stream_in.recv_pyobj()
self.stream_received.emit(data, stream_name)
except zmq.ZMQError:
return False
def send_event(self, data, target=None):
# On the sim side, target is obtained from the currently-parsed stack command
self.event_io.send(target or '*', zmq.SNDMORE)
self.event_io.send_pyobj(data)
def send_stream(self, data, name):
pass