订阅者未收到消息,Pyzmq

时间:2018-11-20 16:23:30

标签: python sockets zeromq pyzmq

我正在尝试将消息(类似于使用原始套接字时的广播)发布到具有已知端口的子网中,但是在订户端,未收到该消息。这个想法是第二台机器不应该知道第一台机器的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))

recv:

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)

2 个答案:

答案 0 :(得分: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")是广播技巧。

答案 1 :(得分:0)

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

如果您的网络掩码为255.255.255.0,则可能无法正常工作。