Абонент не получает сообщение, Pyzmq - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь опубликовать сообщение (это похоже на широковещательную рассылку при использовании необработанных сокетов) в моей подсети с известным портом, но на конце подписчика сообщение не получено.Идея заключается в том, что 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 голосов
/ 04 апреля 2019

Мне кажется, проблема в том, что сокет SUB не может зарегистрироваться в сокете PUB.Несмотря на то, что в принципе данные идут только от PUB до SUB, в действительности существуют также управляющие сообщения (например, темы подписки), которые отправляются обратно в PUB.

Если ваша маска сети255.255.255.0, это, вероятно, не будет работать должным образом.

0 голосов
/ 22 ноября 2018

Вы забыли 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() в подписчике и издателе с помощью своей политики.( Это сообщение является релевантным).
  • Убедитесь, что в брандмауэре открыто 5677.
  • socket.bind("tcp://*:5677") или socket.bind("tcp://0.0.0.0:5677") передает трюк.
...