xpub/xsub官网的解释是增强了pub/sub模式,并且支持双向消息收发。经过阅读其源码,发现xpub/xsub不仅仅是增强了pub/sub,还有些许改动,如:在xsub类型的socket上不能设置subscribe选项:zmq_setsocket(socket,ZMQ_SUBSCRIBE,0x01);
会报不支持的错误,那么,xsub类型的socket到底该如何达到订阅消息的目的呢?
1、官网的:https://rfc.zeromq.org/spec/29/ 竟然没有解释。。。。有点神操作了
2、http://api.zeromq.org/3-2%3azmq-socket#toc12 的ZMQ_XSUB有说明,如下(不翻译了):
Same as ZMQ_SUB except that you subscribe by sending subscription messages to the socket. Subscription message is a byte 1 (for subscriptions) or byte 0 (for unsubscriptions) followed by the subscription body.
Summary of ZMQ_XSUB characteristics |
---|
Compatible peer sockets | ZMQ_PUB, ZMQ_XPUB |
Direction | Unidirectional |
Send/receive pattern | Receive messages, send subscriptions |
Incoming routing strategy | Fair-queued |
Outgoing routing strategy | N/A |
Action in mute state | Drop |
做个简单的解释:ZMQ_XSUB通过发送订阅消息来订阅topic——以1开 头的消息是订阅,以0开头的消息是取消订阅;
如:1、发送1"md.sse",则表示订阅md.sse这个topic
2、发送1"md",则表示订阅md这个topic
3、发送1则表示订阅所有的消息,默认不订阅消息,所以会接收不到。。。。
#1"md"没有写错,可以建一个buf,把1和topic写到buf中,再发送;如:
std::string msg(1,0x1);
msg.append("md.sse");
xsub_socket.send(msg); #订阅了md.ssetopic #这里使用的是zmqpp库,直接使用libzmq也是类似的
解释以下:
58行:从输入的topics中查找有没有,,如果有,则说明包含了多个topic,
60行:以逗号为分割符分割topic,并存储在topic中,
65行:订阅topic
70行:订阅topic
实例代码后面再上传