sockets - ZeroMQ:如何将消息发送到特定的订户

标签 sockets zeromq publish-subscribe messages

在我的情况下,有n个客户端和1个服务器。客户端将请求发送到服务器并接收响应。此外,还需要一种单向消息传递机制,其中服务器将特定的消息发送到特定的客户端,并且期望没有答案。因此,服务器必须能够使用单向消息传递机制专门处理客户端。

请求-响应部分很简单(REQ和REP套接字),但是我不确定如何实现单向消息传递部分。我尝试使用PUB和SUB套接字,每个订阅者都从服务器请求一个ID,并且仅订阅具有该ID的消息,如下所示:

rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE,
                     subscriber_id, strlen (subscriber_id));

从理论上讲,这是可行的,但问题是消息全部在客户端进行广播,然后进行过滤,这对我来说不是一个选择。

所以我的问题是:有没有更好的方法来解决特定的客户?

最佳答案

因此,只有两种方法可以做您想做的事,而且都没有直接达到目标的方法-但最后,我提出了一个可能仍然更好的建议。

您直接通过客户端套接字获取服务器套接字地址的要求只能通过以下两种方式来实现:

  • 使用ROUTER套接字。 ROUTER套接字发送的消息的第一帧是目标对等方的套接字ID。它是唯一支持任何类型的常规寻址的套接字类型。
  • 每个对等方向上旋转一个套接字。这样,您就可以在应用程序中处理寻址:知道哪个套接字属于您想要的对等方,然后就可以使用它。

  • 如果需要是单向套接字类型,则第二种方法是唯一剩下的选项。然后,您可以选择任何一种单向通信策略(PUB/SUB,PUSH/PULL),并且只需为每个连接设置一个新的套接字即可。

    我强烈建议使用ROUTER选项,几乎没有理由强制采用单向要求。只需在ROUTER上将接收HWM设置为1,并忽略或丢弃定期发送给它的消息即可。或者,跳过REP/REQ对,仅使用ROUTER/DEALER进行所有操作,这可能是最佳选择。

    关于sockets - ZeroMQ:如何将消息发送到特定的订户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30918043/

    相关文章:

    ruby-on-rails - Wisper:订阅者听不到广播

    node.js - 如何在 Node 应用程序中向所有关注者获取实时反馈

    Python套接字绑定(bind)0.0.0.0,检查传入消息

    带有 ZeroMQ + Socket.io + 每个客户端范围的 Node.js

    node.js - AWS SQS 和 SNS 中的消息结构

    python - ZeroMQ 操作抛出 EXC : [ Operation cannot be accomplished in current state ]

    javascript - 如何让 ZMQ 路由器在繁忙时引发错误?

    python - 操作系统错误: port/proto not found in for loop

    c++ - 使用 winsock 库发送 GET http 请求时出现 400 bad request 错误

    sockets - (建议): Libraries for packet crafting,捕获和分析