【问题标题】:ZeroMQ, Client<-> Server , bi-directional communication possible with only having the client connect to host?ZeroMQ,客户端<->服务器,只有客户端连接到主机就可以进行双向通信?
【发布时间】:2013-06-08 12:09:38
【问题描述】:

我面临以下问题:

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

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

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

我怎样才能最好地做到这一点,参考代码示例会更好。

非常感谢。

【问题讨论】:

  • 你显然没有阅读 ZeroMq 指南;这些基本问题仅在第一部分就通过代码示例得到了解答,阅读它,它会让您感到惊讶:zguide.zeromq.org/page:all
  • @Raffian,恕我直言,但您可能误读/误解了我的问题。指南的任何第一章都没有回答这个问题。我什至在指南中都没有遇到过回答这个问题的高级模式。我在网上遇到了一些其他人的代码,他们实现了与我在前端和后端、服务器端和客户端在不同任务上以及每个具有两个套接字上寻求的解决方案类似的解决方案。因此,这绝非易事,如果您能查看我的问题和您的否决票,我们将不胜感激。
  • 这里是我提到的参考:codebullets.com/a-splendid-new-way-of-tcp-messaging-920。除了单向消息传递之外,它并没有做太多事情,但它完成了双工消息传递。自己判断,请指点我参考的页面,在 zeromq 指南中完成了一些类似的事情。
  • 我不相信我误读了您的问题,至少不是第一部分。您想做双向发布/订阅,列表中的前两个项目符号,而服务器不知道客户端的地址(为什么这很重要)?这是第 2 章中说明的动态发现问题bit.ly/118L6G7。只需使用不同的端口为客户端和服务器创建单独的发布/订阅套接字,并使用两个单独的代理进行转发;对请求/回复做同样的事情。我无法解决流媒体问题。除此之外,考虑重新表述您的问题,因为它不是 100% 清楚。
  • 我将删除反对票,但除非您编辑问题,否则我不会让我这样做。

标签: c# client messaging zeromq publish-subscribe


【解决方案1】:

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

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

所以你绑定了 Router 和 Pub 套接字,并连接了 Dealer 和 Sub 套接字。比你想要的时候:

  • 发布消息(不期望回复):创建一个信封(pub、channel、message)并通过 Dealer 发送,在路由器端,路由器将收到以下信封(dealer、pub、channel、message) ),因此您可以通过 PUB 套接字在频道上发布消息。

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

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

  • 流式传输:正如您所说,它可以通过发布模式完成

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

【讨论】:

  • @belazs,谢谢,只是想知道,如果我不关心主题订阅,我就不能简单地摆脱客户端的经销商和服务器端的路由器吗?
  • @MattWolf 是的,在我的示例中 sub 仅用于接收来自发布者的消息。我很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多