我正在尝试在ZeroMQ中实现基本的经销商路由器套接字。
我的问题有很多部分。
在此之前,这里是我的示例脚本
DEALER SCRIPT
ROUTER SCRIPT
问题-
首先,我的香草经销商脚本无法从套接字读取消息。
其次,当我实现一个经销商或路由器模式时,是否必须将标识作为头的一部分传递,即消息不能在没有标识的情况下发送。
换句话说,一个经销商-路由器模式(可以看到)可以共存并传递消息,而不在头上发送身份信息。
DEALER WITHOUT ANY IDENTITY
ROUTER WITHOUT ANY IDENTITY
因为,没有身份我也无法让它工作。
注意:-图片中当前的Zeromq ruby库(ruby客户端)是ffi-rzmq
最佳答案
您的代码显示了很多关于zmq工作原理的误解,我建议您阅读the guide并按照ruby示例设置脚本。
以下是我看到的问题:
在您的经销商脚本中,您显式地接收到identity
-它永远不会获得自己的身份作为消息的一部分,这将被ZMQ无声地删除,因为它不打算是消息数据,而是路由器套接字使用的“地址”因此,您实际上是在identity
变量中接收分隔符,在delimiter
变量中接收消息,然后什么都不剩,您的msg
变量为空如果您puts
这三个变量的值,您将看到它。
你不需要在你的经销商插座zmq poller。轮询器用于从多个套接字接收消息,您只使用一个套接字。我不知道它是否真的打算用一个套接字工作,但无论如何它不需要额外的复杂性,把它撕掉。See here for a simple send/receive example from the guide(如果您只是将套接字类型更改为dealer,请添加您的“详细信息”-标识、地址、端口等-并省略发送,它应该对您有用)
在您的第二个示例中,如果您不设置标识,路由器套接字不会将消息寻址到任何连接的客户端-您始终需要将客户端标识作为消息的第一帧发送通常,您将从客户机收到一条消息,其中包括其标识,并且您将使用该标识将消息发回。在第一个示例中,您只能跳过这个步骤,因为您的脚本已经知道标识“client”