Source code for pypot.server.zmqserver
import zmq
import json
import logging
from .server import AbstractServer
logger = logging.getLogger(__name__)
[docs]class ZMQRobotServer(AbstractServer):
def __init__(self, robot, host, port):
""" A ZMQServer allowing remote access of a robot instance.
The server used the REQ/REP zmq pattern. You should always first send a request and then read the answer.
"""
AbstractServer.__init__(self, robot, host, port)
c = zmq.Context()
self.socket = c.socket(zmq.REP)
self.socket.bind('tcp://{}:{}'.format(self.host, self.port))
logger.info('Starting ZMQServer on tcp://%s:%s', self.host, self.port)
[docs] def run(self):
""" Run an infinite REQ/REP loop. """
while True:
req = self.socket.recv_json()
try:
answer = self.handle_request(req)
self.socket.send(json.dumps(answer))
except (AttributeError, TypeError) as e:
self.socket.send_json({'error': str(e)})
[docs] def handle_request(self, request):
meth_name, kwargs = request['robot'].popitem()
meth = getattr(self.restful_robot, meth_name)
for key in ('value', 'args'):
if key in kwargs:
kwargs[key] = json.loads(kwargs[key])
ret = meth(**kwargs)
ret = {} if ret is None else ret
return ret