ZeroMQ,客户< - >服务器,只有客户端连接到主机才可能进行双向通信?

时间:2013-06-08 12:09:39

标签: c# client messaging zeromq publish-subscribe

我遇到以下问题:

我有一个客户端(最终是n-clients)并且喜欢连接到服务器。客户端知道服务器/主机地址,但服务器不知道客户端的地址。我希望能够在客户端 - 服务器之间完成以下消息传递模式(客户端和服务器都需要能够完成以下消息模式):

  • 发布消息(无需回复)
  • 接收消息(无需回复)
  • 请求/接收消息(预期回复)
  • 流消息(这可能是多余的,因为它可能通过上面的发布消息模式提供)

同样重要的一点,我奋斗的地方是如何连接到主机,同时仍然能够发送和接收消息。主机无法连接到客户端,它只能接受客户端连接请求。请注意,我不寻找与客户端和服务器连接的代理/代理的解决方案,否则我可以直接使用rabbitmq等解决方案。

如何最好地完成此操作,参考代码示例更好。

非常感谢。

1 个答案:

答案 0 :(得分:11)

要连接到服务器,客户端需要DEALER套接字,服务器上需要ROUTER套接字。因为您需要发布订阅模式,所以客户端需要SUB套接字,服务器端需要PUB套接字。

  Client       Server
+-------+      +--------+
| Dealer| <--> | Router |
|  Sub  | <--  |  Pub   |
+-------+      +--------+

因此,您绑定路由器和Pub套接字,并连接Dealer和Sub套接字。比你想要的时候:

  • 发布消息(无需回复):创建一个信封(酒吧,频道,消息)并通过经销商发送,在路由器端,路由器将收到以下信封(经销商,酒吧,频道,消息) ),所以你可以通过PUB套接字在频道上发布消息。

  • 接收消息(无需回复):已完成客户端的SUB套接字,并且由于每个发布都通过ROUTER,您可以轻松实现订阅机制,或者只需添加{ {1}}服务器端的套接字,并连接(inproc)到SUB套接字(也许这是一个更清洁的解决方案)。

  • 请求/接收消息(预期回复):可以通过经销商 - 路由器完成。您只需创建一个不同的信封(请求,消息),因此您的路由器(接收:经销商,请求,消息)将知道它应该被处理,并可以向经销商发送回复。如果您的服务器需要向客户端发送请求,您只需要跟踪连接的客户端,并发送信封(经销商,req,msg),以便您的经销商可以回复示例(代表,消息)信封。 / p>

  • 流媒体:如您所述,可以使用发布模式

  • 完成

我就是这样做的,如果你需要心脏跳动,它会有点复杂,但并不多。