【发布时间】: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