ZeroMQ:19---模式之(发布-订阅封包)

  • 我们简单介绍了多帧消息,下面就来看看它的典型用法——消息信封。信封是指为消息注明来源地址,而不修改消息内容。
  • 在发布-订阅模式中,信封包含了订阅信息,用以过滤掉不需要接收的消息。
  • 如果你想要使用发布-订阅信封,就需要自行生成和设置。这个动作是可选的,我们在之前的示例中也没有使用到。在发布-订阅模式中使用信封可能会比较麻烦,但在现实应用中还是很有必要的,毕竟信封和消息的确是两块不想干的数据。
  • 这是发布-订阅模式中一个带有信封的消息:
  • 我们回忆一下,发布-订阅模式中,消息的接收是根据订阅信息来的,也就是消息的前缀。将这个前缀放入单独的消息帧,可以让匹配变得非常明显。因为不会有一个应用程序恰好只匹配了一部分数据。
  • 下面是一个最简的发布-订阅消息信封示例。发布者会发送两类消息:A和B,信封中指明了消息类型:
//
//  发布-订阅消息信封 - 发布者
//  s_sendmore()函数也是zhelpers.h提供的
//
#include "zhelpers.h"
 
int main (void)
{
    //  准备上下文和PUB套接字
    void *context = zmq_init (1);
    void *publisher = zmq_socket (context, ZMQ_PUB);
    zmq_bind (publisher, "tcp://*:5563");
 
    while (1) {
        //  发布两条消息,A类型和B类型
        s_sendmore (publisher, "A");
        s_send (publisher, "We don't want to see this");
        s_sendmore (publisher, "B");
        s_send (publisher, "We would like to see this");
        sleep (1);
    }
    //  正确退出
    zmq_close (publisher);
    zmq_term (context);
    return 0;
}
  • 假设订阅者只需要B类型的消息:
//
//  发布-订阅消息信封 - 订阅者
//
#include "zhelpers.h"
 
int main (void)
{
    //  准备上下文和SUB套接字
    void *context = zmq_init (1);
    void *subscriber = zmq_socket (context, ZMQ_SUB);
    zmq_connect (subscriber, "tcp://localhost:5563");
    zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "B", 1);
 
    while (1) {
        //  读取消息信封
        char *address = s_recv (subscriber);
        //  读取消息内容
        char *contents = s_recv (subscriber);
        printf ("[%s] %s\n", address, contents);
        free (address);
        free (contents);
    }
    //  正确退出
    zmq_close (subscriber);
    zmq_term (context);
    return 0;
}
  • 执行上面的程序时,订阅者会打印如下信息:
[B] We would like to see this
[B] We would like to see this
[B] We would like to see this
[B] We would like to see this
...
  • 这个示例说明订阅者会丢弃未订阅的消息,且接收完整的多帧消息——你不会只获得消息的一部分。
  • 如果你订阅了多个套接字,又想知道这些套接字的标识,从而通过另一个套接字来发送消息给它们(这个用例很常见),你可以让发布者创建一条含有三帧的消息:

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/106882275