Java ZeroMQ两个发布代理

Java ZeroMQ两个发布代理,java,proxy,zeromq,publish-subscribe,Java,Proxy,Zeromq,Publish Subscribe,我想为我们的分布式系统实现一个发布子基础设施。 从图中可以看出,网络背后的想法是,我想用java实现发布者和订阅者。但在JZmq中,曲线加密还不受支持。所以我想在可用的地方用C(++)实现代理(目前我只有java) 这是我的密码 Subscriber.java: import java.nio.charset.Charset; import org.zeromq.ZMQ; import org.zeromq.ZMQ.Context; import org.zeromq.ZMQ.Socket;

我想为我们的分布式系统实现一个发布子基础设施。 从图中可以看出,网络背后的想法是,我想用java实现发布者和订阅者。但在JZmq中,曲线加密还不受支持。所以我想在可用的地方用C(++)实现代理(目前我只有java)

这是我的密码

Subscriber.java

import java.nio.charset.Charset;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Subscriber {
    public static void main(String[] args) {
        String address = args[0];
        String topic = args[1];

        Context context = ZMQ.context(1);
        Socket subscriber = context.socket(ZMQ.SUB);
        subscriber.connect(address);
        subscriber.subscribe(topic.getBytes());

        while (!Thread.currentThread().isInterrupted()) {
            String top = subscriber.recvStr(Charset.defaultCharset());
            String contents = subscriber.recvStr(Charset.defaultCharset());

            System.out.println(top + ": " + contents);
        }
        subscriber.close();
        context.term();
    }    
}
import java.util.Random;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Publisher {
    public static void main(String[] args) {
        String url = args[0];
        String topic = args[1];
        int intervall = Integer.valueOf(args[2]);

        Context context = ZMQ.context(1);
        Socket publisher = context.socket(ZMQ.PUB);

        Random rand = new Random();
        publisher.connect(url);
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(intervall);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int value = rand.nextInt(20) * (rand.nextBoolean() ? (-1) : 1);
            publisher.sendMore(topic);
            publisher.send(String.valueOf(value));
            System.out.println("PUB: " + topic + ":" + value);
        }

        publisher.close();
        context.term();
    }
}
import java.io.PrintStream;

import org.zeromq.ZContext;
import org.zeromq.ZFrame;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
import org.zeromq.ZThread;
import org.zeromq.ZThread.IAttachedRunnable;

public class PubSubProxy {
    static Socket frontend;
    static Socket backend;

    public static void main(String[] args) {
        String addressSubscriber = args[0];
        String modeSubscriber = args[1];
        String addressPublisher = args[2];
        String modePublisher = args[3];

        // Prepare our context and sockets
        // ZContext context = ZMQ.context(1);
        ZContext context = new ZContext();

        // This is where the weather server sits
        frontend = context.createSocket(ZMQ.XSUB);
        if (modeSubscriber.equals("client")) {
            System.out.println("Subscriber connecting to: " + addressSubscriber);
            frontend.connect(addressSubscriber);
        } else if (modeSubscriber.equalsIgnoreCase("server")) {
            System.out.println("Subscriber binding to: " + addressSubscriber);
            frontend.bind(addressSubscriber);
        }
        // This is our public endpoint for subscribers
        backend = context.createSocket(ZMQ.XPUB);

        if (modePublisher.equals("client")) {
            System.out.println("Publisher connecting to: " + addressPublisher);
            backend.connect(addressPublisher);
        } else if (modePublisher.equalsIgnoreCase("server")) {
            System.out.println("Publisher binding to: " + addressPublisher);
            backend.bind(addressPublisher);
        }

        // Subscribe on everything
        // frontend.subscribe("".getBytes());

        // Run the proxy until the user interrupts us
        IAttachedRunnable runnable = new Listener();
        Socket listener = ZThread.fork(context, runnable);
        ZMQ.proxy(frontend, backend, listener);

        frontend.close();
        backend.close();
        context.destroy();
    }

    private static class Listener implements IAttachedRunnable {
        @Override
        public void run(Object[] args, ZContext ctx, Socket pipe) {
            // Print everything that arrives on pipe
            while (true) {
                ZFrame frame = ZFrame.recvFrame(pipe);
                if (frame == null)
                    break; // Interrupted
                System.out.println(frame.toString());
                frame.destroy();
            }
        }
    }
}
Publisher.java

import java.nio.charset.Charset;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Subscriber {
    public static void main(String[] args) {
        String address = args[0];
        String topic = args[1];

        Context context = ZMQ.context(1);
        Socket subscriber = context.socket(ZMQ.SUB);
        subscriber.connect(address);
        subscriber.subscribe(topic.getBytes());

        while (!Thread.currentThread().isInterrupted()) {
            String top = subscriber.recvStr(Charset.defaultCharset());
            String contents = subscriber.recvStr(Charset.defaultCharset());

            System.out.println(top + ": " + contents);
        }
        subscriber.close();
        context.term();
    }    
}
import java.util.Random;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Publisher {
    public static void main(String[] args) {
        String url = args[0];
        String topic = args[1];
        int intervall = Integer.valueOf(args[2]);

        Context context = ZMQ.context(1);
        Socket publisher = context.socket(ZMQ.PUB);

        Random rand = new Random();
        publisher.connect(url);
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(intervall);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int value = rand.nextInt(20) * (rand.nextBoolean() ? (-1) : 1);
            publisher.sendMore(topic);
            publisher.send(String.valueOf(value));
            System.out.println("PUB: " + topic + ":" + value);
        }

        publisher.close();
        context.term();
    }
}
import java.io.PrintStream;

import org.zeromq.ZContext;
import org.zeromq.ZFrame;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
import org.zeromq.ZThread;
import org.zeromq.ZThread.IAttachedRunnable;

public class PubSubProxy {
    static Socket frontend;
    static Socket backend;

    public static void main(String[] args) {
        String addressSubscriber = args[0];
        String modeSubscriber = args[1];
        String addressPublisher = args[2];
        String modePublisher = args[3];

        // Prepare our context and sockets
        // ZContext context = ZMQ.context(1);
        ZContext context = new ZContext();

        // This is where the weather server sits
        frontend = context.createSocket(ZMQ.XSUB);
        if (modeSubscriber.equals("client")) {
            System.out.println("Subscriber connecting to: " + addressSubscriber);
            frontend.connect(addressSubscriber);
        } else if (modeSubscriber.equalsIgnoreCase("server")) {
            System.out.println("Subscriber binding to: " + addressSubscriber);
            frontend.bind(addressSubscriber);
        }
        // This is our public endpoint for subscribers
        backend = context.createSocket(ZMQ.XPUB);

        if (modePublisher.equals("client")) {
            System.out.println("Publisher connecting to: " + addressPublisher);
            backend.connect(addressPublisher);
        } else if (modePublisher.equalsIgnoreCase("server")) {
            System.out.println("Publisher binding to: " + addressPublisher);
            backend.bind(addressPublisher);
        }

        // Subscribe on everything
        // frontend.subscribe("".getBytes());

        // Run the proxy until the user interrupts us
        IAttachedRunnable runnable = new Listener();
        Socket listener = ZThread.fork(context, runnable);
        ZMQ.proxy(frontend, backend, listener);

        frontend.close();
        backend.close();
        context.destroy();
    }

    private static class Listener implements IAttachedRunnable {
        @Override
        public void run(Object[] args, ZContext ctx, Socket pipe) {
            // Print everything that arrives on pipe
            while (true) {
                ZFrame frame = ZFrame.recvFrame(pipe);
                if (frame == null)
                    break; // Interrupted
                System.out.println(frame.toString());
                frame.destroy();
            }
        }
    }
}
pubsubxy.java

import java.nio.charset.Charset;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Subscriber {
    public static void main(String[] args) {
        String address = args[0];
        String topic = args[1];

        Context context = ZMQ.context(1);
        Socket subscriber = context.socket(ZMQ.SUB);
        subscriber.connect(address);
        subscriber.subscribe(topic.getBytes());

        while (!Thread.currentThread().isInterrupted()) {
            String top = subscriber.recvStr(Charset.defaultCharset());
            String contents = subscriber.recvStr(Charset.defaultCharset());

            System.out.println(top + ": " + contents);
        }
        subscriber.close();
        context.term();
    }    
}
import java.util.Random;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Publisher {
    public static void main(String[] args) {
        String url = args[0];
        String topic = args[1];
        int intervall = Integer.valueOf(args[2]);

        Context context = ZMQ.context(1);
        Socket publisher = context.socket(ZMQ.PUB);

        Random rand = new Random();
        publisher.connect(url);
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(intervall);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int value = rand.nextInt(20) * (rand.nextBoolean() ? (-1) : 1);
            publisher.sendMore(topic);
            publisher.send(String.valueOf(value));
            System.out.println("PUB: " + topic + ":" + value);
        }

        publisher.close();
        context.term();
    }
}
import java.io.PrintStream;

import org.zeromq.ZContext;
import org.zeromq.ZFrame;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
import org.zeromq.ZThread;
import org.zeromq.ZThread.IAttachedRunnable;

public class PubSubProxy {
    static Socket frontend;
    static Socket backend;

    public static void main(String[] args) {
        String addressSubscriber = args[0];
        String modeSubscriber = args[1];
        String addressPublisher = args[2];
        String modePublisher = args[3];

        // Prepare our context and sockets
        // ZContext context = ZMQ.context(1);
        ZContext context = new ZContext();

        // This is where the weather server sits
        frontend = context.createSocket(ZMQ.XSUB);
        if (modeSubscriber.equals("client")) {
            System.out.println("Subscriber connecting to: " + addressSubscriber);
            frontend.connect(addressSubscriber);
        } else if (modeSubscriber.equalsIgnoreCase("server")) {
            System.out.println("Subscriber binding to: " + addressSubscriber);
            frontend.bind(addressSubscriber);
        }
        // This is our public endpoint for subscribers
        backend = context.createSocket(ZMQ.XPUB);

        if (modePublisher.equals("client")) {
            System.out.println("Publisher connecting to: " + addressPublisher);
            backend.connect(addressPublisher);
        } else if (modePublisher.equalsIgnoreCase("server")) {
            System.out.println("Publisher binding to: " + addressPublisher);
            backend.bind(addressPublisher);
        }

        // Subscribe on everything
        // frontend.subscribe("".getBytes());

        // Run the proxy until the user interrupts us
        IAttachedRunnable runnable = new Listener();
        Socket listener = ZThread.fork(context, runnable);
        ZMQ.proxy(frontend, backend, listener);

        frontend.close();
        backend.close();
        context.destroy();
    }

    private static class Listener implements IAttachedRunnable {
        @Override
        public void run(Object[] args, ZContext ctx, Socket pipe) {
            // Print everything that arrives on pipe
            while (true) {
                ZFrame frame = ZFrame.recvFrame(pipe);
                if (frame == null)
                    break; // Interrupted
                System.out.println(frame.toString());
                frame.destroy();
            }
        }
    }
}
正如您所看到的,我已经向代理添加了一个侦听器,以查看是否收到了消息。 在发布服务器端代理(图中最上面的一个)上,我得到消息,但在另一个代理上什么都没有

这就是我执行应用程序的方式

#beaglebone #1
#proxy #1
java -Djava.library.path=/usr/local/lib -jar proxy.jar ipc:///tmp/pub server tcp://*:5555 server 
#pub
java -Djava.library.path=/usr/local/lib -jar publisher.jar ipc:///tmp/pub temperature 10000
java -Djava.library.path=/usr/local/lib -jar publisher.jar ipc:///tmp/pub humidity 1000
java -Djava.library.path=/usr/local/lib -jar publisher.jar ipc:///tmp/pub testvar 5000

#beaglebone #2
#proxy #2
java -Djava.library.path=/usr/local/lib -jar proxy.jar tcp://192.168.0.192:5555 client ipc:///tmp/sub server
#sub
java -Djava.library.path=/usr/local/lib -jar subscriber.jar ipc:///tmp/sub temperature
java -Djava.library.path=/usr/local/lib -jar subscriber.jar ipc:///tmp/sub humidity
java -Djava.library.path=/usr/local/lib -jar subscriber.jar ipc:///tmp/sub testvar

您似乎混淆了客户机/服务器模式和发布/订阅模式

在发布/订阅模式中,发布者通知其订阅者(如果有)。发布者应使用
bind
(侦听订阅),订阅者应使用
connect
(请求订阅)

那么你的交流就变成了:

为此,您可以:

  • 修改Publisher.java替换
    Publisher.connect(url)
    publisher.bind(url)绑定
  • 修改pubsubxy.java删除无用的客户机/服务器参数
然后,您应该能够通过以下方式从后端到前端接收数据:

#beaglebone #1
#proxy #1
java -Djava.library.path=/usr/local/lib -jar proxy.jar ipc:///tmp/pub tcp://*:5555 
#pub
java -Djava.library.path=/usr/local/lib -jar publisher.jar ipc:///tmp/pub temperature 10000

#beaglebone #2
#proxy #2
java -Djava.library.path=/usr/local/lib -jar proxy.jar tcp://192.168.0.192:5555 ipc:///tmp/sub
#sub
java -Djava.library.path=/usr/local/lib -jar subscriber.jar ipc:///tmp/sub temperature

这个想法是,代理是愚蠢的,安不需要知道关于出版商的任何事情。@user2071938在建议的答案中,代理所知道的并不比你的问题多。它使用相同的参数集。