我正在尝试将消息(类似于使用原始套接字时的广播)发布到具有已知端口的子网中,但是在订户端,未收到该消息。这个想法是第二台机器不应该知道第一台机器的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)
答案 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
套接字注册自己。即使概念上的数据仅从PUB
到SUB
,实际上,也有控制消息(例如订阅主题)被发送回PUB
。
如果您的网络掩码为255.255.255.0,则可能无法正常工作。