ZeroMQ PUB-SUB通信:SUB未接收任何内容 我试图在ZeOMQ中获得一个PUB-SUB通信,在那里,PUB处于C++中,Python中的子。我使用的是python 3.8、ZeroMQ 4.3.2、pyzmq 18.1.1和cppzmq 4.5.0
酒吧:ZeroMQ PUB-SUB通信:SUB未接收任何内容 我试图在ZeOMQ中获得一个PUB-SUB通信,在那里,PUB处于C++中,Python中的子。我使用的是python 3.8、ZeroMQ 4.3.2、pyzmq 18.1.1和cppzmq 4.5.0,c++,python-3.x,zeromq,python,C++,Python 3.x,Zeromq,Python,酒吧: 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
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发送消息时没有错误。实际上,它返回发送消息的长度
注:
- 睡眠是为了试验,以便能够在酒吧发送之前启动SUB。但是如果我移除它并首先启动SUB,我会有同样的行为
- 如果执行以下操作,它将打印
:none
您可能会喜欢在深入了解更多细节之前先看一看
步骤-1:,以便正确定义
和
,并验证其在中断
条件下的正确使用,以避免立即从发送循环中中断
第0步:另一方面,将ZeroMQ
子项设置为首先订阅任何主题,使用“
”作为主题筛选器显式设置的字符串如果有效:您的问题被隔离到正确的主题设置中,以便实际执行主题筛选如果没有:您似乎也有视线“可见性”问题(当您不在同一台本地主机上时,可能会发生这种情况(是的,有时在这里也会发生))。我没有快速的方法检查您的工作,但我可以给您一些基本的提示,让您解决问题
我建议您开始拆除接收器侧的过滤器。为此,您必须将setsockopt
替换为类似于socket.setsockopt_字符串(zmq.SUBSCRIBE,“”)
此外,始终在接收方,我建议您只打印您正在接收的内容,而不对数据做任何假设,因此我将使用简单的打印(socket.recv_string())
(甚至是打印(socket.recv())
)
您的简单(调试)接收器如下所示:
导入zmq
context=zmq.context()
socket=context.socket(zmq.SUB)
插座。连接(“tcp://localhost:5556")
socket.setsockopt_字符串(zmq.SUBSCRIBE,“”)
data=socket.recv_string()
打印(数据)
通过这种方式,您可以了解通过套接字发送的是什么(如果有)
如果收到的内容不是您期望的,那么您可以在发送方工作。例如,您可以查看socket.send()
的ZMQ\u SNDMORE
标志,该标志允许您创建多部分消息。(有关“主题筛选”的工作原理,请参阅文档)
如果您仍然需要帮助,明天我可能会更彻底地看一看。感谢大家的回答。我发现这是一个典型的“慢接合”问题。我在循环之前移动了睡眠(10),以查看发生了什么,它起了作用
我的第一条消息中有什么不清楚的地方(因为有人过度清理了我的代码以便在这里澄清)fValue要么设置为一个数字,在循环中有一定数量的交互,要么设置为0,无限循环。因此,我将其设置为3,只是为了发送几条消息,但发布方没有足够的时间连接到SUB,以便SUB看到消息。添加了+1,用于引用所有发布版本。包括ZeroMQ,这是软件工程的良好标志不熟练的手艺
Err = socket.connect("tcp://localhost:5556")
print(Err)