【问题标题】:How configure a Multiple PUB/ single SUB python ZMQ Ubuntu如何配置多个 PUB/单个 SUB python ZMQ Ubuntu
【发布时间】:2020-11-19 19:10:39
【问题描述】:

我有两个虚拟机(VirtualBOx、Ubuntu 18.04 和 python-zmq[16.0.2-2build2])在同一台物理机 (Win10) 中运行。两台机器都配置为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)

由于我想要一个带有多个服务器 (PUB) 的单个客户端 (SUB),其中可能有数百甚至数千个服务器,因此为每个 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 (broadcast), localhost/127.0.0.1 和它的 IP (192.168.1.55) -> 不接收消息

192.168.1.66(服务器的 IP)-> 接收消息但在大型系统中不实用

有什么办法解决吗?

【问题讨论】:

    标签: python zeromq publish-subscribe pyzmq


    【解决方案1】:

    有什么办法解决这个问题?

    避免违反任何 API 记录的属性。虽然.bind()-方法可以为tcp://-transport-class 尝试绑定到任何localhost 端IP 地址,但.connect()-方法显然可以不。

    ZMQError 中所述:

    socket.connect ("tcp://*:%s" % port)
    zmq.error.ZMQError: 参数无效

    更正IP地址目标,
    .connect( "tcp://{0:}:{1:}".format( IP, PORT ) )-方法应在哪里尝试“ring-so-as-to-get-connection”。

    【讨论】:

    • IP和PORT应该如何初始化?
    • PORT 当且仅当您在 PUB 端使用了非默认端口,然后为 SUB 端 ;o) 和 IP 设置相同?这难道不是 PUB 端的全球可见的 IP 地址吗?拓扑在这里:stackoverflow.com/a/64924949/3666197 那么问题出在哪里?
    • 如果我配置了 PUB IP 地址,我只会收到数据包 `socket.connect("tcp://{0:}:{1:}".format("192.168.1.66", "5556 "))`
    • 如果我有多个发布者怎么办?我无法为订阅者配置来自这些发布者的数千个 IP
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2022-11-19
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多