必要なパブリッシュ/サブスクライブ環境を容易にするために 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 へのサブスクライバー接続をテストしたため、ファイアウォールの問題ではないと思います。