订阅者没有收到消息,Pyzmq

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

我试图发布一条消息(就像使用原始套接字时的广播一样)到我的已知端口的子网但是在用户端,没有收到消息。我的想法是第二台机器不应该知道第一台机器的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)
python sockets zeromq pyzmq
2个回答
1
投票

你忘记了订户方面的zmq.SUB。你键入sub.setsocketopt()而不是sub.setsockopt()


试试吧:

Publisher:

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)

Subscriber:

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")是广播技巧。

0
投票

我认为问题是SUB套接字不能用PUB套接字注册自己。即使在概念中数据仅从PUBSUB,实际上,还有控制消息(例如订阅主题),被发送回PUB

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

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