如何使用相同的端口让两个发布者使用ZeroMQ向同一个订阅者发送数据?

时间:2018-02-06 07:29:52

标签: c++ sockets zeromq

我正在使用C ++创建一个应用程序,其中两个发布者(pub1pub2)应该向3个订阅者发送数据,比如s1s2,{ {1}}。

模式如下:

s3将数据发送到Pub1s1

s2将数据发送到Pub2s2

现在,如果我为发布者使用不同的TCP端口,它正在运行,但我需要使用单个端口,当两个发布者使用相同的端口时,只有绑定的发布者才能使用而另一个发布者抛出内存错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在内部使用zmq::proxy允许多个发布套接字通过一个TCP端口提供数据。

P1(subject P1) -inproc-> |                       |--tcp-> SUB(P1)
                         |--XSUB(zmq::proxy)XPUB-|--tcp-> SUB(P1,P2)
P2(subject P2) -inproc-> |                       |--tcp-> SUB(P2)

方法:

发布商申请

  • 两个PUB套接字(在发布商应用内),一个发布主题为“P1”,另一个发布“P2”
  • 他们都将您的应用程序内部连接到XSUB zmq::proxy//:inproc上方XPUB。代理也在您的发布商应用程序中运行
  • 代理的另一端(subscribe_sock.setsockopt(ZMQ_SUBSCRIBE, "P1", 2)侧)绑定到单个TCP端口。

订阅者申请

  • 您的订阅者应用程序连接到TCP端口并订阅他们需要的内容。
    • 例如,S1将订阅“P1”,而S2将订阅“P1”和“P2”
    • 例如subscribe_sock.setsockopt(ZMQ_SUBSCRIBE, "P2", 2)
    • 例如File file = new File("pathname"); MediaScannerConnection.scanFile(getContext(), new String[]{file.getAbsolutePath()}, null /*mimeTypes*/, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String s, Uri uri) { // uri is in format content://... } });