PUB/SUB 不发送数据

问题描述 投票:0回答:1

我正在同一网络内的两台连接机器之间用Python发送数据(已成功连接)。

发布者代码定义为:

def senderzmq(self, lat, lon):
    sock = zmq.Context().socket(zmq.PUB)
    sock.bind("tcp://*:10000")
    running = True
    while running:
        sock.send_string(f"Lat {lat}, Lon={lon}")

接收器具有以下格式:

import zmq
context=zmq.Context()
socket=context.socket(zmq.SUB)
socket.connect("tcp://192.168.1.35:10000")
while True:
         message=socket.recv_string()
         print(message)

senderzmq 函数的触发方式是:

print(f"Lat {self.lat}, Lon={self.lon}")
self.senderzmq(self.lat, self.lon)

self.lat 和 self.lon 从此静态方法更新:

@staticmethod
    def gnss(event):
        self.lat = event.latitude + LAT0
        self.lon = event.longitude + LON0

LAT0和LON0都是手动配置的。

上述开发是有效的,但是发送方总是发送相同的数据,看起来发送方仍然处于 while True 状态,没有监听新数据。如果我删除 while True,则上述内容不起作用。知道如何退出 while True 但在每个循环中传输新数据吗?

谢谢。 劳尔

python zeromq publish-subscribe pyzmq
1个回答
0
投票

我认为您在订户中缺少的部分如下:

socket.setsockopt(zmq.SUBSCRIBE, b"") # or socket.subscribe(b"")

在 ZMQ 中,您应该订阅通配符(“”)或指定主题(例如

socket.subscribe(b"TOPIC_NAME")
)。

我使用以下代码片段测试了代码:

publisher.py

import zmq
import time


def main():
    context = zmq.Context()
    sock = context.socket(zmq.PUB)
    sock.bind("tcp://*:5563")
    running = True
    while running:
        sock.send_string("Lat=42, Lon=42")
        time.sleep(1.0)


if __name__ == "__main__":
    main()

subsriber.py

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5563")
socket.setsockopt(zmq.SUBSCRIBE, b"")

while True:
    message = socket.recv_string()
    print(message)

并且成功了。

我还建议您快速浏览 zmq 指南(您可以随时转向“python”获取那里的代码片段)。

© www.soinside.com 2019 - 2024. All rights reserved.