【问题标题】:Subscriber does not receive message, Pyzmq订阅者没有收到消息,Pyzmq
【发布时间】:2018-11-20 16:23:30
【问题描述】:

我正在尝试使用已知端口向我的子网发布消息(就像使用原始套接字时的广播),但在订阅者端,未收到消息。这个想法是第二台机器不应该知道第一台机器的 IP 地址,这就是我使用广播 IP 的原因。使用 UDP 或 TCP 原始套接字,它可以工作,但我正在尝试学习 pub-sub 模式,不知道如何融入这个想法。


这是我的代码:

出版商:

import zmq
import sys
import time
context=zmq.Context()
socket=context.socket(zmq.PUB)
socket.bind("tcp://192.168.1.255:5677")
while True:
    data='hello'.encode()
    socket.send(data)
    #time.sleep(1)

订阅者:

context=zmq.Context()
    sub=context.socket(zmq.PUB)
    sub.setsocketopt(zmq.SUBSCRIBE, "".encode())
    sub.connect('tcp://192.168.1.255:5677')
    sub.recv()
    print(sub.recv())

就原始 UDP 而言,我编写了一个完美运行的代码。

广播:

def broadcast(Host,port):
    #send bd
    sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    msg=get_ip_data("wlp3s0")
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    time.sleep(1.5)
    # print("yes sending", client)

    sock.sendto(msg.encode(), (Host,port))

接收:

def broadcast_recv():
    #listen bd
    sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sock.bind((get_bd_address("wlp1s0"),12345))
    # receive broadcast
    msg, client = sock.recvfrom(1024)
    a=(msg.decode())
    print(a)

【问题讨论】:

标签: python sockets zeromq pyzmq


【解决方案1】:

您似乎忘记了订阅方的zmq.SUB。您还使用了sub.setsocketopt() 而不是sub.setsockopt()


试试看:

发布者:

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5677")  # Note.

while True:
    socket.send_string('hello')
    time.sleep(1)

订阅者:

context = zmq.Context()
sub=context.socket(zmq.SUB)  # Note.
sub.setsockopt(zmq.SUBSCRIBE, b"")  # Note.
sub.connect('tcp://192.168.1.255:5677')

while True:
    print(sub.recv())

[注意]:

  • 您还可以使用您的策略更改订阅者和发布者中的.bind().connect()。 (This post 是相关的)。
  • 确保5677 在防火墙中打开。
  • socket.bind("tcp://*:5677")socket.bind("tcp://0.0.0.0:5677") 是广播技巧。

【讨论】:

  • 您好,感谢您的脚本。我也在考虑是否可以在 zmq 中进行广播。 @benyamin 贾法里
  • @keerthana socket.bind("tcp://*:5677")socket.bind("tcp://0.0.0.0:5677") 是广播技巧。
  • 谢谢,你回答了我的 pub-sub 疑问,所以检查它作为回答,虽然我想广播到子网地址。所以我不能使用 0.0.0.0 地址,而是使用 192.X.X.255 地址并且订阅者没有收到数据。 :(
【解决方案2】:

我认为问题在于SUB 套接字无法向PUB 套接字注册自身。尽管在概念上数据只是从PUBSUB,但实际上,也有控制消息(例如订阅主题)被发送回PUB

如果您的网络掩码是 255.255.255.0,这可能无法按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多