我试图发布一条消息(就像使用原始套接字时的广播一样)到我的已知端口的子网但是在用户端,没有收到消息。我的想法是第二台机器不应该知道第一台机器的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)
你忘记了订户方面的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")
是广播技巧。我认为问题是SUB
套接字不能用PUB
套接字注册自己。即使在概念中数据仅从PUB
到SUB
,实际上,还有控制消息(例如订阅主题),被发送回PUB
。
如果您的网络掩码是255.255.255.0,这可能无法按预期工作。