客户端如何使用 zeromq 订阅和收听回复?也就是说,在客户端,我想运行一个循环,它只接收消息并有选择地发送请求,而在服务器端,我大部分时间都想发布,但有时也接收请求。看起来我必须有两个不同的套接字 - 一个用于每种通信模式。是否有可能避免这种情况,并且在服务器端从 zeromq 回调线程上的套接字接收“请求通知”,同时在我自己的线程中将消息推送到套接字?
问问题
10063 次
3 回答
16
我对 ZeroMQ 非常陌生,所以我不确定你想要的是否被认为是最佳实践。但是,使用多个套接字的解决方案非常简单,使用zmq_poll
.
基本思想是同时拥有客户端和服务器:
- 为 pub/sub 打开一个套接字
- 为 req/rep 打开一个套接字
zmq_poll
在无限循环中使用循环中的两个套接字之间的多路复用发送和接收- 在循环中处理 req/rep 和 pub/sub 事件,因为它们发生
以zmq_poll
这种方式与多个套接字一起使用很好,因为它完全避免了线程。0MQ 指南在这里有一个很好的例子。请注意,在该示例中,它们使用-1
in超时zmq_poll
,这会导致它阻塞,直到任何多路复用套接字上发生至少一个事件,但如果您的循环需要做,使用 x 毫秒或其他东西的超时是很常见的还有一些其他的工作。
于 2011-07-16T17:26:25.923 回答
2
您可以使用 2 个线程来处理不同的套接字。挑战在于,如果您需要在线程之间共享数据,则需要以安全的方式进行同步。
另一种方法是使用 ZeroMQ 轮询器来选择具有新数据的套接字。然后,该过程将按照 bjlaub 解释的方式使用单个循环。
于 2011-07-19T23:06:32.727 回答
1
这可以使用Majordomo 协议的变体/子集来完成。这是想法:
您的服务器将是路由器套接字,您的客户端将是经销商套接字。连接到服务器后,客户端需要发送某种订阅或“你好”消息(您的设计)。服务器接收该数据包,但(作为路由器套接字)也接收该客户端的 ID。当服务器需要(通过您的设计)向该客户端发送某些内容时,它会将其发送到该 ID。客户端可以随意发送和接收,因为它是一个经销商套接字。
于 2016-05-03T19:44:23.490 回答