zeromq怎么一个端口发送多个主题

简介: 我们这里使用czmq4 版本处理。在CZMQ的版本4中,在一个端口上发布多个订阅主题。这是通过使用PUB/SUB模式实现的。在这种模式下,一个或多个发布者将消息发布到一个或多个主题,然后一个或多个订阅者可以订阅一个或多个主题来接收消息。

我们这里使用czmq4 版本处理。

在CZMQ的版本4中,在一个端口上发布多个订阅主题。这是通过使用PUB/SUB模式实现的。在这种模式下,一个或多个发布者将消息发布到一个或多个主题,然后一个或多个订阅者可以订阅一个或多个主题来接收消息。


在发布者端,你可以通过将主题作为消息的一部分来发布到特定的主题。例如,如果你有两个主题"TopicA"和"TopicB",你可以这样发布消息:

zsock_t *publisher = zsock_new(ZMQ_PUB);
zsock_bind(publisher, "tcp://*:12345");
zmsg_t *msg = zmsg_new();
zmsg_addstr(msg, "TopicA");
zmsg_addstr(msg, "Some message for topic A");
zmsg_send(&msg, publisher);
msg = zmsg_new();
zmsg_addstr(msg, "TopicB");
zmsg_addstr(msg, "Some message for topic B");
zmsg_send(&msg, publisher);


在订阅者端,你可以订阅一个或多个主题,只接收这些主题的消息。例如,如果你只对"TopicA"感兴趣,你可以这样订阅:


zsock_t *subscriber = zsock_new(ZMQ_SUB);
zsock_connect(subscriber, "tcp://localhost:12345");
zsock_set_subscribe(subscriber, "TopicA");


如果你对所有主题都感兴趣,你可以不指定主题,订阅所有消息:


zsock_set_subscribe(subscriber, "");


这样,你就可以在一个端口上发布多个主题,让订阅者根据自己的需求订阅感兴趣的主题。


CZMQ库中,在一个端口上发布多个主题

是的,在CZMQ库中,你可以在一个端口上发布多个主题。这是通过ZMQ的发布/订阅模式实现的。


在发布/订阅模式中,一个或多个发布者将消息发送到一个或多个主题,然后一个或多个订阅者可以订阅一个或多个主题来接收相关的消息。


在CZMQ中,你可以使用zsock_new_pub函数创建一个发布者套接字,然后使用zstr_send函数发送消息。在发送消息时,你可以在消息的开始部分包含一个主题字符串,然后订阅者可以使用这个主题来过滤他们感兴趣的消息。


例如,以下是一个发布者发送两个不同主题的消息的示例:

zsock_t *publisher = zsock_new_pub("tcp://*:5556");
zstr_send(publisher, "topic1 message1");
zstr_send(publisher, "topic2 message2");


在这个例子中,"topic1"和"topic2"是主题,“message1"和"message2"是消息。订阅者可以选择订阅"topic1”,“topic2”,或者两者都订阅。


请注意,主题是消息的一部分,而不是端口或套接字的一部分。这意味着你可以在同一个发布者套接字上发布任意数量的主题。


增加安全性

当然这样获取所有内容的订阅方式如此的简单,我们当然不期望它能随意获取不想给它的主题,这就引出一个问题:我希望除非订阅方知道主题名称,否则他不能够通过 * 得到消息内容。


在ZeroMQ中,如果你希望只有知道主题的订阅者才能接收到消息,你可以考虑使用CURVE安全机制。CURVE是一个加密机制,它可以确保只有拥有正确密钥的订阅者才能接收和解密消息。


首先,你需要为每个主题生成一对公钥和私钥。然后,将公钥提供给任何希望订阅该主题的订阅者。订阅者使用公钥来接收和解密消息。


在发布者端,你需要使用私钥来加密消息。这样,只有拥有对应公钥的订阅者才能解密和接收消息。


以下是使用CZMQ的CURVE安全机制的示例:


// 创建和配置安全套接字
zcert_t *cert = zcert_new();
zsock_t *publisher = zsock_new(ZMQ_PUB);
zsock_set_curve_server(publisher, 1);
zsock_set_curve_secretkey(publisher, zcert_secret_txt(cert));
// 绑定和发送消息
zsock_bind(publisher, "tcp://*:12345");
zstr_send(publisher, "Hello");
// 创建和配置订阅者套接字
zsock_t *subscriber = zsock_new(ZMQ_SUB);
zsock_set_curve_serverkey(subscriber, zcert_public_txt(cert));
zsock_set_curve_publickey(subscriber, zcert_public_txt(cert));
zsock_set_curve_secretkey(subscriber, zcert_secret_txt(cert));
// 连接和接收消息
zsock_connect(subscriber, "tcp://localhost:12345");
char *msg = zstr_recv(subscriber);


这样,只有知道主题公钥的订阅者才能接收到消息。


上述代码中,我们使用了ZeroMQ的CURVE安全机制来实现消息的加密和解密。CURVE是基于Elliptic Curve Cryptography的安全机制,它可以确保只有拥有正确密钥的订阅者才能接收和解密消息。


在这个例子中,我们首先创建了一个新的证书zcert_t *cert = zcert_new();。这个证书包含了一对公钥和私钥。然后,我们创建了一个新的发布者套接字,并设置它为CURVE服务器,并设置其私钥为刚刚生成的证书的私钥。


接下来,我们创建了一个新的订阅者套接字,并设置了它的服务器公钥、公钥和私钥。这样,订阅者就可以使用这个公钥来接收和解密消息了。


至于订阅者如何得到主题公钥,这通常需要通过安全的方式进行分发。例如,你可以通过安全的邮件、安全的文件传输或者安全的API来将公钥发送给订阅者。在这个例子中,我们假设订阅者已经以某种方式得到了公钥。


需要注意的是,这个例子只是一个简单的示例,实际使用时可能需要更复杂的逻辑来处理密钥的生成、存储和分发。同时,你也需要确保你的系统的其他部分(如网络、操作系统等)也是安全的,以防止密钥被窃取。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

目录
相关文章
|
6月前
|
消息中间件
消息中间件系列教程(16) -RabbitMQ-应答模式
消息中间件系列教程(16) -RabbitMQ-应答模式
40 0
|
9月前
|
消息中间件
RabbitMQ如何支持事务性消息的发送和接收
RabbitMQ消息的发送和接收
140 0
|
7月前
|
消息中间件
RabbitMQ如何确保消息发送,消息接收
RabbitMQ如何确保消息发送,消息接收
45 0
|
消息中间件 负载均衡 网络协议
ZMQ/ZeroMQ的三种消息模式
ZMQ/ZeroMQ的三种消息模式
ZMQ/ZeroMQ的三种消息模式
|
12月前
|
消息中间件 Java
RabbitMQ发送方确认机制
RabbitMQ发送方确认机制
75 0
|
消息中间件 Java Spring
RabbitMQ 服务器接收到过多的请求
RabbitMQ 服务器接收到过多的请求
277 0
|
消息中间件 网络协议
RabbitMQ学习(四):消息应答
为了保证消息在发送过程中不丢失,rabbitmq 引入消息应答机制,消息应答就是:消费者在接 收到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了,rabbitmq 可以把该消息删除了。
142 0
RabbitMQ学习(四):消息应答
|
消息中间件 缓存 JSON
RabbitMq数据发送监听
RabbitMq数据发送监听
|
移动开发 网络协议 测试技术
服务器接收客户端消息|学习笔记
快速学习服务器接收客户端消息
135 0
|
网络协议 Java
Java网络编程Demo,使用TCP 实现简单群聊功能Groupchat,创建一个服务端,使多个客户端都能收到消息
Java网络编程Demo,使用TCP 实现简单群聊功能Groupchat,创建一个服务端,使多个客户端都能收到消息
163 0
Java网络编程Demo,使用TCP 实现简单群聊功能Groupchat,创建一个服务端,使多个客户端都能收到消息