python下zeromq的router-router模式带monitor监视连接状态
服务端
import zmq
from zmq.utils.monitor import recv_monitor_message, parse_monitor_message
import threading
import time
from zmq.eventloop import zmqstream
from tornado import ioloop
def serv(socket):
i = 0
while 1:
time.sleep(0.5)
name = input('name >>>').encode()
data = input('data >>>').encode()
socket.send_multipart([name, data, str(i).encode()])
print('Sent one massage to %s.' , name)
def event_m(msg):
EVENT_MAP = {}
for name in dir(zmq):
if name.startswith('EVENT_'):
value = getattr(zmq, name)
EVENT_MAP[value] = name
parsed_msg = parse_monitor_message(msg)
print("mointoring: ", EVENT_MAP[parsed_msg['event']], parsed_msg)
def getcommand(msg):
print('The server has connected with a client.')
print(msg)
if __name__ == "__main__":
ctx = zmq.Context()
socket = ctx.socket(zmq.ROUTER)
socket.setsockopt_string(zmq.IDENTITY, 'router1')
socket.bind("tcp://127.0.0.1:6667") # 只能有一个使用bind, 其他使用connect
socket.monitor("inproc://monitor.dealer", zmq.EVENT_ALL)
print('Waiting for the connection from clients...')
socket_monitor = ctx.socket(zmq.PAIR)
socket_monitor.connect("inproc://monitor.dealer")
stream = zmqstream.ZMQStream(socket)
stream.on_recv(getcommand)
stream_monitor = zmqstream.ZMQStream(socket_monitor)
stream_monitor.on_recv(event_m)
ioloop.IOLoop.instance().start()
客户端
客户端与服务器差别不大,只是修改了名称和绑定方式
socket.setsockopt_string(zmq.IDENTITY, 'router2')
socket.connect("tcp://127.0.0.1:6667") # 只能有一个使用bind, 其他使用connect
使用
服务器中输入信息传输到的客户端router2和信息
name >>>router2
data >>>123
客户端接收到
[b'router1', b'123', b'0']