diff options
Diffstat (limited to 'ryu/contrib/tinyrpc/transports/zmq.py')
-rw-r--r-- | ryu/contrib/tinyrpc/transports/zmq.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/ryu/contrib/tinyrpc/transports/zmq.py b/ryu/contrib/tinyrpc/transports/zmq.py new file mode 100644 index 00000000..502a1ddc --- /dev/null +++ b/ryu/contrib/tinyrpc/transports/zmq.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import # needed for zmq import +import zmq + +from . import ServerTransport, ClientTransport + + +class ZmqServerTransport(ServerTransport): + """Server transport based on a :py:const:`zmq.ROUTER` socket. + + :param socket: A :py:const:`zmq.ROUTER` socket instance, bound to an + endpoint. + """ + + def __init__(self, socket): + self.socket = socket + + def receive_message(self): + msg = self.socket.recv_multipart() + return msg[:-1], msg[-1] + + def send_reply(self, context, reply): + self.socket.send_multipart(context + [reply]) + + @classmethod + def create(cls, zmq_context, endpoint): + """Create new server transport. + + Instead of creating the socket yourself, you can call this function and + merely pass the :py:class:`zmq.core.context.Context` instance. + + By passing a context imported from :py:mod:`zmq.green`, you can use + green (gevent) 0mq sockets as well. + + :param zmq_context: A 0mq context. + :param endpoint: The endpoint clients will connect to. + """ + socket = zmq_context.socket(zmq.ROUTER) + socket.bind(endpoint) + return cls(socket) + + +class ZmqClientTransport(ClientTransport): + """Client transport based on a :py:const:`zmq.REQ` socket. + + :param socket: A :py:const:`zmq.REQ` socket instance, connected to the + server socket. + """ + + def __init__(self, socket): + self.socket = socket + + def send_message(self, message, expect_reply=True): + self.socket.send(message) + + if expect_reply: + return self.socket.recv() + + @classmethod + def create(cls, zmq_context, endpoint): + """Create new client transport. + + Instead of creating the socket yourself, you can call this function and + merely pass the :py:class:`zmq.core.context.Context` instance. + + By passing a context imported from :py:mod:`zmq.green`, you can use + green (gevent) 0mq sockets as well. + + :param zmq_context: A 0mq context. + :param endpoint: The endpoint the server is bound to. + """ + socket = zmq_context.socket(zmq.REQ) + socket.connect(endpoint) + return cls(socket) |