다중 PUB / 단일 SUB Python ZMQ Ubuntu를 구성하는 방법

Nov 19 2020

동일한 물리적 머신 (Win10) 내에서 실행되는 두 개의 VM (VirtualBOx, Ubuntu 18.04 및 python-zmq [16.0.2-2build2])이 있습니다. 두 시스템 모두 Bridge로 구성되어 있으며 192.168.1.66-192.168.1.55를 성공적으로 ping 할 수 있습니다. 이 튜토리얼을 따랐습니다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 (브로드 캐스트), localhost / 127.0.0.1 및 IP (192.168.1.55)-> 메시지를받지 못함

192.168.1.66 (서버의 IP)-> 메시지를 받지만 대규모 시스템에서는 실용적이지 않음

이 문제를 해결할 방법이 있습니까?

답변

user3666197 Nov 19 2020 at 22:21

Q : 이 문제를 해결할 방법이 있습니까?

API 문서화 속성에 반대하지 마십시오. -transport-class에 .bind()대한 -method는 tcp://실제로 모든 -side localhostIP 주소에 바인딩하려고 할 수 있지만 -method는 .connect()명백한 이유로 할 수 없습니다.

에 통지 된대로 ZMQError:

socket.connect ("tcp://*:%s" % port)
zmq.error.ZMQError : 잘못된 인수

IP 주소 대상을 수정하십시오. 여기서
.connect( "tcp://{0:}:{1:}".format( IP, PORT ) )-method 는 "연결될 때까지 링"을 시도 해야합니다 .