c++ - ZeroMQ PUB-SUB 通信:SUB 什么也没收到
问题描述
我正在尝试在 ZeroMQ 中进行 PUB-SUB 通信,其中 PUB 在 C++ 中,SUB 在 python 中。我正在使用 python 3.8、ZeroMQ 4.3.2、pyzmq 18.1.1 和 cppzmq 4.5.0
酒馆 :
int main()
{
Sleep(10000);
zmq::context_t context(1);
zmq::socket_t publisher(context, ZMQ_PUB);
publisher.bind("tcp://*:5556");
int zipcode, temperature, relhumidity;
while (true) {
// Get values (first supposed to be random)
zipcode = 10001;
temperature = 27;
relhumidity = 61;
// Send message to the subscriber
zmq::message_t message(20);
snprintf((char *)message.data(), 20, "%05d %d %d", zipcode, temperature, relhumidity);
publisher.send(message, zmq::send_flags::none);
std::fprintf(stderr, "[INFO] Sent data: %i, %i, %i \n", zipcode, temperature, relhumidity);
if (fValue && j >= fValue) {
break;
}
j++;
}
}
子:
import sys
import zmq
# Socket to talk to server
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5556")
# Subscribe to zipcode, default is NYC, 10001
zip_filter = "10001"
# Python 2 - ascii bytes to unicode str
if isinstance(zip_filter, bytes):
zip_filter = zip_filter.decode('ascii')
socket.setsockopt_string(zmq.SUBSCRIBE, zip_filter)
# Process 5 updates
for update_nbr in range(3):
string = socket.recv_string()
zipcode, temperature, relhumidity = string.split()
print("Received data : %s , %d , %d" % (zip_filter, temperature, relhumidity))
但是我无法让它工作,因为 SUB 一直在等待,string = socket.recv_string()
而 PUB 发送消息没有错误。实际上,它返回已发送消息的长度。
备注:
- Sleep 用于试用,以便能够在 PUB 发送之前启动 SUB。但是如果我删除它并首先启动 SUB,我会有同样的行为。
- 如果我执行以下操作,它会打印
none
:
Err = socket.connect("tcp://localhost:5556")
print(Err)
我是 ZeroMQ 的新手,我真的不知道从哪里开始解决这个问题。任何的想法 ?
解决方案
问:有什么想法吗?
如果您从未使用过 ZeroMQ,
那么您可能会喜欢先看看“ZeroMQ原则在不到5 秒内”,然后再深入了解更多细节
步骤-1: 修复您的 c++ 端代码,以便正确定义 thej
和 thefValue
并验证其在break
-condition 中的正确用法,以避免立即break
从发送循环中退出。
第 0 步:在python端,将 ZeroMQ 设置SUB
为首先订阅任何主题,使用""
- 作为主题过滤器的显式设置的字符串。如果可行:您的问题与实际进行主题过滤的正确主题设置隔离。如果不是:您似乎也有视线“可见性”问题(当不在同一位置时可能会发生localhost
(是的,这有时也会发生在这里))。
推荐阅读
- android - 在其他 xml drawable 中重用 xml 渐变
- android - 在图像上传到 Firebase 存储之前调用 downloadUrl
- android - 如果数据已经存在,如何停止向 Firebase 添加数据?
- r - 用向量替换三角矩阵的一部分
- python - 为 Dockerfile 安装 Shapley 时出错
- python - 借助 Blender 2.8 中的 Python 脚本保存具有透明背景的渲染图像
- python - Django:如何验证其字段是从表单 __init__ 方法中的查询集生成的表单?
- javascript - 为什么这个javascript重复?
- android - Android Studio 问题 - 构建失败并出现异常
- mysql - 合计 1 列