ZMQ可以通过pub-sub socket向特定客户端发布消息吗?

时间:2014-09-06 03:31:22

标签: sockets zeromq pyzmq jzmq

我正在使用pub / Sub Socket并且当前服务器订阅byte [0](所有主题) 客户端订阅字节[16] - 特定标题为主题

但是,我无法阻止客户端订阅可以接收所有其他消息的byte [0]。

我的应用程序就像一个应用程序游戏,它有一个使用ZMQ作为连接的服务器 许多客户都有一个ZMQ套接字与服务器通信。

在这种情况下我应该使用哪种模式或插槽?

由于

1 个答案:

答案 0 :(得分:0)

" ... 无法阻止客户端订阅字节[0],可以接收所有其他消息。"


停止"订阅所有" SUB客户端的模式

对于ZMQ PUB / SUB 正式沟通模式原型, SUB 客户端必须提交它的订阅请求(通过zmq_setsockopt())。

PUB -side(游戏服务器)没有选择从它那边做到这一点。

创建新的SUB套接字时没有订阅状态,因此是一个绝对限制性的过滤器,没有消息传递。 (有关下面SUBSCRIBE / UNSUBSCRIBE参考的方法的详细信息)


ZeroMQ规范详细设置:

int zmq_setsockopt (       void   *socket,
                           int     option_name,
                     const void   *option_value,
                           size_t  option_len
                     );

Caution: only ZMQ_SUBSCRIBE
              ZMQ_UNSUBSCRIBE
              ZMQ_LINGER
         take effect immediately,
         other options are active only for subsequent socket bind/connects.

ZMQ_SUBSCRIBE 建立邮件过滤器

ZMQ_SUBSCRIBE选项应在ZMQ_SUB套接字上建立新的消息过滤器。新创建的ZMQ_SUB套接字将过滤掉所有传入的消息,因此您应该调用此选项来建立初始消息过滤器。

长度为零的 option_value 应订阅所有传入的消息。

非空 option_value将使用指定的前缀订阅所有开头的消息。

可以将多个过滤器附加到单个ZMQ_SUB套接字,在这种情况下,如果消息与至少一个过滤器匹配,则应接受该消息。

ZMQ_UNSUBSCRIBE 删除邮件过滤器

ZMQ_UNSUBSCRIBE选项将删除ZMQ_SUB套接字上的现有消息过滤器。指定的过滤器必须与先前使用ZMQ_SUBSCRIBE选项建立的现有过滤器匹配。如果套接字附加了相同过滤器的多个实例,则ZMQ_UNSUBSCRIBE选项应仅删除一个实例,其余部分保持不变并正常运行。


如何强制执行特定于服务器的ad-hoc ZMQ_SUBSCRIBE限制?

这可以通过扩展消息传递层并添加控制模式套接字来实现,该套接字将承载客户端ZMQ_SUB消息过滤的服务器启动设置。

收到服务器指定的新ZMQ_SUBSCRIBE / ZMQ_UNSUBSCRIBE设置后,ZMQ_SUB客户端代码将只处理该请求并相应地添加zmq_setsockopt()。< / p>

这种方法的FSA驱动语法具有更多的可能性,因此任何游戏服务器/游戏社区都可以顺利地采用这种方式。


我应该使用哪种模式或插槽?

ZeroMQ是一个乐高风格的元素库,可以组合成更大的图像。

期待这样一个聪明的图书馆拥有一个适合所有人的 ninja-element 正在仔细研究 oxymoron

所以,要避免&#34; 永无止境的故事&#34;添加&#34; 尽管这......以及...... &#34;

  1. 审核所有要求和&amp;端到端可扩展解决方案的列表功能

  2. 设计消息传递概念&amp; 验证以满足所有列出的要求&amp;涵盖[1]

  3. 中的所有功能
  4. 实施 [2]

  5. 测试 [3]&amp; 正确用于满足1:1的端到端规范[1]

  6. 享受它。你已经端到端地完成了它。