【问题标题】:Basic Dealer-Router Socket not working基本经销商路由器插座不工作
【发布时间】:2015-08-26 21:32:21
【问题描述】:

我正在尝试在 ZeroMQ 中实现基本的 DEALER - ROUTER 套接字。 我的问题有多个部分。

在此之前,这是我的示例脚本

DEALER SCRIPT

ROUTER SCRIPT

问题 -

首先,我的原版 DEALER SCRIPT 无法读取来自 SOCKET 的消息。

其次,当我实施 DEALER 或 ROUTER PATTERN 时,是否必须传递 IDENTITY(作为标头的一部分),即不能在没有任何 IDENTITY 的情况下发送消息。

换句话说,DEALER - ROUTER 模式(如下所示)可以共存并在它们之间传递消息,而无需在标头中发送身份信息。

DEALER WITHOUT ANY IDENTITY

ROUTER WITHOUT ANY IDENTITY

因为,如果没有身份,我也无法让它工作。

注意 : - 图片中的 Zeromq ruby​​ 库(ruby 客户端)是ffi-rzmq

【问题讨论】:

  • 如果没有明确设置身份,ZMQ会设置身份。无需在dealer端设置,但需要在路由器端使用才能发回消息。
  • 现在我仔细查看了您的代码 - 如果您希望路由器能够发送消息,路由器 必须 接收来自经销商的消息以了解其身份没有明确设置身份。
  • @Jason 已接受。因此,如果我在从 ROUTER 发送消息时传递了 DEALER 的 IDENTITY,则可以通过 here 看到。你能解释一下为什么在这种情况下没有交换消息的原因吗?

标签: ruby zeromq


【解决方案1】:

您的代码对 ZMQ 的工作方式存在很多误解,我建议您阅读 the guide 并按照 Ruby 示例设置您的脚本。

这是我看到的问题:

  1. 在您的 DEALER 脚本中,您明确收到 identity - 它永远不会将自己的身份作为消息的一部分,这被 ZMQ 静默删除,因为它不打算成为消息数据,而是打算成为“ ROUTER 套接字使用的地址”。因此,您实际上将分隔符接收到您的 identity 变量中,将消息接收到您的 delimiter 变量中,然后什么都没有留下,您的 msg 变量为空。如果你puts 三个变量的值,你就会看到。
  2. 您的 DEALER 套接字中不需要 ZMQ 轮询器。轮询器旨在从多个套接字接收消息,您只使用一个套接字。我不知道它是否真的打算与一个套接字一起工作,但无论如何它是不必要的额外复杂性,把它撕掉。 See here for a simple send/receive example from the guide(如果您只是将套接字类型更改为 DEALER,请添加您的“详细信息” - 身份、地址、端口等 - 并省略发送,它应该适合您)
  3. 在第二个示例中,设置身份,ROUTER 套接字不会将消息发送给任何连接的客户端 - 你总是需要发送客户端身份作为消息的第一帧。通常,您会收到来自客户端的消息,其中包括其身份,并且您将使用该身份将消息发回。您只能在第一个示例中跳过它,因为您的脚本已经知道身份“客户端”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2019-03-20
    • 2015-08-08
    • 2017-02-15
    相关资源
    最近更新 更多