- 我们简单介绍了多帧消息,下面就来看看它的典型用法——消息信封。信封是指为消息注明来源地址,而不修改消息内容。
- 在发布-订阅模式中,信封包含了订阅信息,用以过滤掉不需要接收的消息。
- 如果你想要使用发布-订阅信封,就需要自行生成和设置。这个动作是可选的,我们在之前的示例中也没有使用到。在发布-订阅模式中使用信封可能会比较麻烦,但在现实应用中还是很有必要的,毕竟信封和消息的确是两块不想干的数据。
- 这是发布-订阅模式中一个带有信封的消息:
- 我们回忆一下,发布-订阅模式中,消息的接收是根据订阅信息来的,也就是消息的前缀。将这个前缀放入单独的消息帧,可以让匹配变得非常明显。因为不会有一个应用程序恰好只匹配了一部分数据。
- 下面是一个最简的发布-订阅消息信封示例。发布者会发送两类消息: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;
}
//
// 发布-订阅消息信封 - 订阅者
//
#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
...
- 这个示例说明订阅者会丢弃未订阅的消息,且接收完整的多帧消息——你不会只获得消息的一部分。
- 如果你订阅了多个套接字,又想知道这些套接字的标识,从而通过另一个套接字来发送消息给它们(这个用例很常见),你可以让发布者创建一条含有三帧的消息: