如何配置多个 PUB/单个 SUB python ZMQ Ubuntu
How configure a Multiple PUB/ single SUB python ZMQ Ubuntu
我在同一台物理机 (Win10) 中有两个虚拟机(VirtualBOx,Ubuntu 18.04 和 python-zmq[16.0.2-2build2])运行。两台机器都配置成Bridge,可以ping通192.168.1.66-192.168.1.55。我已经学习了本教程 https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pubsub.html。如果 PUB(服务器)配置为
,它会起作用
import zmq
import random
import sys
import time
port = "5557"
if len(sys.argv) > 1:
port = sys.argv[1]
int(port)
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
while True:
topic = random.randrange(9999,10005)
messagedata = random.randrange(1,215) - 80
print "%d %d" % (topic, messagedata)
socket.send("%d %d" % (topic, messagedata))
time.sleep(1)
SUB(客户端)为
import sys
import zmq
port = "5557"
if len(sys.argv) > 1:
port = sys.argv[1]
int(port)
if len(sys.argv) > 2:
port1 = sys.argv[2]
int(port1)
# Socket to talk to server
context = zmq.Context()
socket = context.socket(zmq.SUB)
print "Collecting updates from weather server..."
socket.connect ("tcp://192.168.1.66:%s" % port)
if len(sys.argv) > 2:
socket.connect ("tcp://localhost:%s" % port1)
# Subscribe to zipcode, default is NYC, 10001
topicfilter = "10001"
socket.setsockopt(zmq.SUBSCRIBE, topicfilter)
# Process 5 updates
total_value = 0
for update_nbr in range (5):
string = socket.recv()
topic, messagedata = string.split()
total_value += int(messagedata)
print topic, messagedata
print "Average messagedata value for topic '%s' was %dF" % (topicfilter, total_value / update_nbr)
由于我想要一个客户端(SUB)和多个服务器(PUB),它们可以是数百甚至数千个,因此为每个PUB配置一个IP是不可行的。有没有不用指定IP就可以订阅的方法?或者至少是一个广播。我尝试在 socket.connect ("tcp://IP:%s" % port)
:
中的客户端进行配置
"*"
报错:
Traceback (most recent call last):
File "sub_client.py", line 18, in <module>
socket.connect ("tcp://*:%s" % port)
File "zmq/backend/cython/socket.pyx", line 528, in zmq.backend.cython.socket.Socket.connect (zmq/backend/cython/socket.c:5980)
File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc (zmq/backend/cython/socket.c:8400)
zmq.error.ZMQError: Invalid argument
192.168.1.1 (GW), 192.168.1.255 (广播), localhost/127.0.0.1 和它的 IP (192.168.1.55) -> 不接收消息
192.168.1.66(服务器的 IP)-> 可以接收消息但在大型系统中不实用
有什么办法解决这个问题吗?
Q : Any way to solve this?
避免违背任何 API 记录的 属性。虽然 .bind()
-方法可以用于 tcp://
-传输-class 尝试确实绑定到任何 localhost
- 端 IP-地址,.connect()
-方法,显然不能。
正如在 ZMQError
中通知的那样:
socket.connect ("tcp://*:%s" % port)
zmq.error.ZMQError: Invalid argument
更正 IP 地址目标,
.connect( "tcp://{0:}:{1:}".format( IP, PORT ) )
方法应在何处尝试“ring-so-as-to-get-connection”。
我在同一台物理机 (Win10) 中有两个虚拟机(VirtualBOx,Ubuntu 18.04 和 python-zmq[16.0.2-2build2])运行。两台机器都配置成Bridge,可以ping通192.168.1.66-192.168.1.55。我已经学习了本教程 https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pubsub.html。如果 PUB(服务器)配置为
,它会起作用import zmq
import random
import sys
import time
port = "5557"
if len(sys.argv) > 1:
port = sys.argv[1]
int(port)
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
while True:
topic = random.randrange(9999,10005)
messagedata = random.randrange(1,215) - 80
print "%d %d" % (topic, messagedata)
socket.send("%d %d" % (topic, messagedata))
time.sleep(1)
SUB(客户端)为
import sys
import zmq
port = "5557"
if len(sys.argv) > 1:
port = sys.argv[1]
int(port)
if len(sys.argv) > 2:
port1 = sys.argv[2]
int(port1)
# Socket to talk to server
context = zmq.Context()
socket = context.socket(zmq.SUB)
print "Collecting updates from weather server..."
socket.connect ("tcp://192.168.1.66:%s" % port)
if len(sys.argv) > 2:
socket.connect ("tcp://localhost:%s" % port1)
# Subscribe to zipcode, default is NYC, 10001
topicfilter = "10001"
socket.setsockopt(zmq.SUBSCRIBE, topicfilter)
# Process 5 updates
total_value = 0
for update_nbr in range (5):
string = socket.recv()
topic, messagedata = string.split()
total_value += int(messagedata)
print topic, messagedata
print "Average messagedata value for topic '%s' was %dF" % (topicfilter, total_value / update_nbr)
由于我想要一个客户端(SUB)和多个服务器(PUB),它们可以是数百甚至数千个,因此为每个PUB配置一个IP是不可行的。有没有不用指定IP就可以订阅的方法?或者至少是一个广播。我尝试在 socket.connect ("tcp://IP:%s" % port)
:
"*"
报错:
Traceback (most recent call last):
File "sub_client.py", line 18, in <module>
socket.connect ("tcp://*:%s" % port)
File "zmq/backend/cython/socket.pyx", line 528, in zmq.backend.cython.socket.Socket.connect (zmq/backend/cython/socket.c:5980)
File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc (zmq/backend/cython/socket.c:8400)
zmq.error.ZMQError: Invalid argument
192.168.1.1 (GW), 192.168.1.255 (广播), localhost/127.0.0.1 和它的 IP (192.168.1.55) -> 不接收消息
192.168.1.66(服务器的 IP)-> 可以接收消息但在大型系统中不实用
有什么办法解决这个问题吗?
Q : Any way to solve this?
避免违背任何 API 记录的 属性。虽然 .bind()
-方法可以用于 tcp://
-传输-class 尝试确实绑定到任何 localhost
- 端 IP-地址,.connect()
-方法,显然不能。
正如在 ZMQError
中通知的那样:
socket.connect ("tcp://*:%s" % port)
zmq.error.ZMQError: Invalid argument
更正 IP 地址目标,.connect( "tcp://{0:}:{1:}".format( IP, PORT ) )
方法应在何处尝试“ring-so-as-to-get-connection”。