ZeroMQ Client<→服务器,双向通信可能只有客户端连接到主机

本文关键字:客户端 连接 主机 Client 服务器 双向通信 ZeroMQ | 更新日期: 2023-09-27 18:17:44

我面临以下问题:

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

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

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

我如何才能最好地完成这一点,甚至更好地参考代码示例。

非常感谢。

ZeroMQ Client<→服务器,双向通信可能只有客户端连接到主机

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

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

所以你绑定了Router和Pub套接字,连接了Dealer和Sub套接字。当你想:

  • Publish Messages(期望没有回复):创建一个信封(pub, channel, message)并通过Dealer发送,在Router端Router会收到以下信封(Dealer, pub, channel, message),所以你可以通过pub套接字在channel上发布消息。

  • Receive Messages(期望没有回复):它是用客户端的SUB套接字完成的,因为每次发布都要经过ROUTER,你可以很容易地实现订阅机制,或者只是在服务器端添加一个SUB套接字,并连接(inproc)到PUB套接字(也许这是一个更简洁的解决方案)。

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

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

我是这样做的,如果你需要心跳,它会变得有点复杂,但不是很多。