python - 使用 pyzmq 广播到子网地址
问题描述
我正在尝试使用广播数据包到子网地址,我成功地尝试使用套接字的广播选项来做到这一点,但是我最近开始学习 ZeroMQ,所以我想用它来将数据包广播到子网。我使用了zmq.PUB
,zmq.SUB
但在订阅者端,由于我使用子网地址,数据包未送达。如果我使用机器的 IP 地址,那么它可以工作,但这不是我想要的。
有没有使用 ZMQ 进行广播的选项?
这是我到目前为止尝试的代码:
出版商:
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://192.X.X.255:9999") # 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.x.x.255:9999') -> publishing only to subnet
while True:
print(sub.recv())
我们可以使用常规套接字广播数据包,例如,使用:
sock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
但我想用 ZMQ 来替换它。ZMQ 是否真的以不同的方式进行广播发现,或者我们应该使用与常规广播相同的代码?
解决方案
假设您有三台机器(M1、M2、M3),它们具有三个不同的 IP 地址,具有相同的子网和定义的端口。我们想向每个订阅者(M1, M2 )发布一条消息(来自M1 ) ,因此我们将有以下代码片段:
发布者(机器 1):
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:9999") # Note.
while True:
socket.send_string('hello-all')
time.sleep(1)
订户(机器 2):
context = zmq.Context()
sub=context.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBE, b"")
sub.connect('tcp://Machine1_IP:9999') # Note
while True:
print(sub.recv())
订户(机器 3):
context = zmq.Context()
sub=context.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBE, b"")
sub.connect('tcp://Machine1_IP:9999') # Note
while True:
print(sub.recv())
推荐阅读
- php - laravel 5.6 Eloquent One to Many Relationship on multiple tables
- scala - 这个 flatMap 代码背后的魔力是什么?
- excel - Userform TextBox not Reading Large Numbers
- powerbi - Split custom fields in Power BI
- python - Jupityr notebook kernel error - FileNotFoundError: [WinError 2]
- android - Kotlin - 使用 Persistence Room:runtime lib 从 Room 数据库返回新插入的 id
- java - 我们可以用 play java 框架实现 testNG 吗?
- monitoring - 在zabbix中使用活动代理监控日志文件?
- docker - 桥接接口启动问题上的 Docker 侦听器
- java - Java - 地址已在使用中(网络绑定)