8

必要なパブリッシュ/サブスクライブ環境を容易にするために ZeroMQ を使用しています。Python を使用して (EventLoop を使用して) マシン A で発行サーバーを実行しています。現在、マシン B で C++ で実行されている 1 つのサブスクライバーと、マシン C で Python で実行されている 2 番目のサブスクライバー (EventLoop を使用) があります。

マシン B がマシン C より先にマシン A にサブスクライブした場合、B はサブスクライブされたメッセージを受け取り、C は受け取りません。さらに、マシン A で確立された接続を見ると、マシン B の接続のみが存在し、C の接続は存在しません。マシン C が B よりも先に A にサブスクライブする場合、逆になります。

これが私の発行者コードです:

import zmq
from zmq.eventloop import ioloop, zmqstream

ioloop.install()

context   = zmq.Context(1)
socket    = context.socket(zmq.PUB)
publisher = zmqstream.ZMQStream(socket)
socket.bind("tcp://*:1337")

def publish():
  publisher.send_multipart(("heartbeat", "OHAI"))

ioloop.PeriodicCallback(publish, 5000).start()
ioloop.IOLoop.instance().start()

これが私の Python サブスクライバー コードです。

import zmq
from zmq.eventloop import ioloop, zmqstream

ioloop.install()

context    = zmq.Context(1)
socket     = context.socket(zmq.SUB)
subscriber = zmqstream.ZMQStream(socket)
socket.setsockopt(zmq.SUBSCRIBE, "heartbeat")
socket.connect("tcp://pub.local:1337")

def subscription(message):
  print "Message Received: %s" % (message[1])

subscriber.on_recv(subscription)
ioloop.IOLoop.instance().start()

パブリッシャーが複数の着信サブスクライバー ソケットを受け入れないのはなぜですか? マシン A で複数のサブスクライバーを実行すると、複数のサブスクライバーが正常に動作することはおそらく注目に値しますが、ファイアウォールを無効にして B と C から A へのサブスクライバー接続をテストしたため、ファイアウォールの問題ではないと思います。

4

1 に答える 1

5

元の投稿に有益なコメントを寄せてくれた皆さんに感謝します。この動作は、使用されている ZeroMQ バージョンの不一致が原因であることが判明しました...私の見落としです。

于 2012-10-25T17:16:51.373 に答える