ZeroMQ 运行 服务器 Java

ZeroMQ running server Java

我目前正在尝试开发一个服务器,基本上应该随时从未知数量的客户端获取传入数据。即系统将有多个客户端发送数据,服务器的工作基本上只是收集数据并将其保存到数据库中。

  1. 现在我想让服务器一直运行。现在服务器只接收一个客户端并关闭。如果我说在接收和打印消息部分周围做一个 while(true)- 循环,它甚至不会做一次。

  2. 据我所知,REP REQ 并不是最好的模式,什么模式最好让服务器获取传入数据?

  3. Using Curve (a.k.a.Ironhouse pattern),客户端需要有服务器证书,假设一个想要向服务器发送数据的新客户端,应该如何访问服务器证书?我从 ZMQ 指南或其他站点找到的所有示例都只是指本地的、通常相同的 class 服务器-客户端应用程序,其中客户端仅访问证书,因为它们位于相同的 class ...但这不是一个现实的案例。

感谢所有回答、提示和建议。 谢谢

private class ServerTask extends Thread {

        public void run() {

            try(ZContext context = new ZContext()){ //create context
                ZAuth authenticator = new ZAuth(context); //create authenticator for incoming clients
                authenticator.setVerbose(true); //get indication of what the authenticator is deciding
                authenticator.allow("127.0.0.1"); //Whitelisting an adress, all other adresses will be rejected
                //authenticator.configureCurve(CERTIFICATE_FOLDER); //Tell authenticator to use the certificate store in .curve
                //ZCert server_cert = new ZCert(); //Create a server certificate
                //writeServerCertToFile(server_cert); //write the cert so client can use it

                //Create and bind server socket
                ZMQ.Socket server = context.createSocket(SocketType.REP);
                //server.setZAPDomain("global".getBytes());
                //server.setCurveServer(true);
                //server.setCurvePublicKey(server_cert.getPublicKey());
                //server.setCurveSecretKey(server_cert.getSecretKey());
                server.bind("tcp://*:9000");

                //recieve and print message

                String message = server.recvStr(0);
                System.out.println("received message: " + message);
                System.out.println("I should not be printed before the recieved message");



                try {
                    System.out.println("destroys the auth and context");
                    authenticator.close();
                    context.destroy();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }
    }

我几个月前就解决了这个问题,但如果将来能帮助使用 ZeroMQ 的人,我最终使用了拉-推模式,将数据负载平衡到工作线程池。还使用 Inproc 进行 frontend/backend 通信。这似乎是最合适的解决方案。