客户端如何使用zeromq订阅和收听回复? 也就是说,在客户端,我想运行一个只接收消息并有选择地发送请求的循环,而在服务器端我想发布大部分时间,但有时也会收到请求。 看起来我必须有两个不同的插座 - 每个插槽用于一种通信模式。是否有可能避免这种情况,并在服务器端从zeromq回调线程上的套接字接收“请求通知”,同时将消息推送到我自己的线程中的套接字?
答案 0 :(得分:15)
我对ZeroMQ非常陌生,所以我不确定你想要的是否是最佳实践。但是,使用zmq_poll
时,使用多个套接字的解决方案非常简单。
基本思想是同时拥有客户端和服务器:
zmq_poll
在循环中的两个套接字之间发送和接收以这种方式使用zmq_poll
多个套接字很不错,因为它完全避免了线程。 0MQ指南有一个good example here。请注意,在该示例中,它们在-1
中使用zmq_poll
的超时,这导致它阻塞,直到在任何多路复用套接字上发生至少一个事件,但是使用超时时间很常见如果您的循环也需要执行其他工作,则为x毫秒或其他内容。
答案 1 :(得分:2)
您可以使用2个线程来处理不同的套接字。挑战在于,如果需要在线程之间共享数据,则需要以安全的方式进行同步。
另一种方法是使用ZeroMQ Poller选择具有新数据的套接字。然后,该过程将以bjlaub解释的方式使用单个循环。
答案 2 :(得分:1)
这可以使用Majordomo Protocol的变体/子集来完成。这是个主意:
您的服务器将是路由器插座,您的客户将是经销商插座。连接到服务器后,客户端需要发送某种订阅或“hello”消息(您的设计)。服务器接收该数据包,但(作为router socket)也接收该客户端的ID。当服务器需要向该客户端发送内容时(通过您的设计),它会将其发送到该ID。客户可以随意发送和接收,因为它是经销商插座。