【问题标题】:ZeroMQ inter-language translation of messages CPPZMQ -- JeroMQ -- PyZMQZeroMQ 消息的跨语言翻译 CPPZMQ -- JeroMQ -- PyZMQ
【发布时间】:2018-07-31 18:15:10
【问题描述】:

在 C++ ZMQ Publisher 中,我将字符串打包到 message_t 中,如下所示:

int main()
{
     zmq::context_t context(1);
     zmq::socket_t socket(context, ZMQ_PUB);
     socket.bind("tcp://*:5555");
     socket.setsockopt(ZMQ_CONFLATE, 1);
     std::cout << "Server Up and Sending\n";
     while(true)
     {
          std::string str = "Hello from C++!";
          zmq::message_t msg(str.data(), str.length());
          bool ret = socket.send(msg);
          if(ret)
          {
               std::cout << "Sending\n";
          }
     }
     return 0;
}

我想弄清楚如何在 JeroMQ (Java ZMQ) 中接收;这是我目前所拥有的:

  ZMQ.Context context = ZMQ.context(1);
  ZMQ.Socket socket = context.socket(ZMQ.SUB);
  socket.connect("tcp://localhost:5555");
  socket.subscribe("".getBytes());
  while(true)
  {
        String msg = socket.recvStr();
        System.out.println(msg);
  }

也在 PyZMQ (Python ZMQ) 中:

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
address = 'tcp://localhost:5555'
socket.connect(address)
socket.setsockopt_string(zmq.SUBSCRIBE, unicode(''))

print "start"
print "connecting to ", address

while True:
    try:
        msg = socket.recv_string()
        print msg

但是,我的 JeroMQ 尝试或 PyZMQ 尝试都没有收到我的字符串消息。

【问题讨论】:

  • JeroMQ 版本缺少zmq_setsockopt(socket, ZMQ_SUBSCRIBE)(不知道正确的语法是什么)。也许socket.subscribe 也一样,我不知道。
  • 我相信 socket.subscribe("".getBytes()); 是 JeroMQ 等价于 CPPZMQ:socket.setsockopt(ZMQ_SUBSCRIBE, "", 0); PyZMQ 等价于:socket.setsockopt_string(zmq.SUBSCRIBE, unicode(''))
  • C++ 和 Python 的组合对我来说效果很好。我正在使用 Python3,并将unicode('') 替换为u""。 (当然,我还添加了问题中缺少的except 分支)
  • 过去,对于 pub/sub 套接字,我有一些奇怪的 libzmq 3.x 和 4.x 不匹配。根据您构建非 C 语言绑定的方式,最终可能会使用旧包。也有可能当时真正的问题是 PyZMQ Python 端实际上是为 4.x 构建的,但它最终动态链接到 libzmq.so 的 3.x 版本,反之亦然。这甚至意味着版本函数返回了“正确”的版本,但它仍然绑定到错误的共享对象。

标签: java c++ zeromq pyzmq jeromq


【解决方案1】:

试试这个sn-p代码订阅

import zmq
import time

port = "5555"

context = zmq.Context()
socket = context.socket(zmq.SUB)

socket.setsockopt(zmq.SUBSCRIBE, '')
socket.setsockopt(zmq.CONFLATE, 1)  # last msg only.
socket.connect("tcp://localhost:%s" % port)  # must be placed after above options.

while 1:
    time.sleep(1)
    data = socket.recv()
    print data

[注意]:

如果不起作用,请在您的 C++ ZeroMQ 发布器中删除以下行:

socket.setsockopt(ZMQ_CONFLATE, 1);

【讨论】:

    【解决方案2】:

    您正在发送一个 C 字符串(没有空终止符)。

    您正在尝试接收 python 或 java 字符串。

    它们可能不兼容,recvStr / recv_string 可能正在阻塞等待字符串结束位置的详细信息。

    只需使用标准的 recv 函数(不是字符串版本)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2021-11-24
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多