【问题标题】:Is ZeroMQ server listening infinitely?ZeroMQ 服务器是否无限监听?
【发布时间】:2017-06-09 07:45:53
【问题描述】:

我正在尝试使用 ZeroMQ 实现客户端服务器。

我在无限循环中运行服务器,绑定到套接字并无限轮询套接字。

当客户端发送请求时,服务器只接收第一次。后面的请求没有被服务器接收到,下面是我的代码sn-p

服务器:

        ZMQ.Socket socket = context.socket(ZMQ.REP);
        socket.bind ("tcp://*:5555");
        System.out.println("Server is in receive mode");
            while (!Thread.currentThread ().isInterrupted ()) {           
                Poller poller = new Poller(1);
                poller.register(socket, Poller.POLLIN);
                poller.poll();
                if (poller.pollin(0)) {
                    ZMsg zmqMessage = ZMsg.recvMsg(socket);                 
                    if (zmqMessage!=null) {
                        zmqMessage.getFirst().getData();
                    }
                }

客户:

    ZMQ.Socket socket = context.socket(ZMQ.REQ);
    socket.connect ("tcp://localhost:5555");
    ZMsg readyFrame = new ZMsg();
    readyFrame.add(new ZFrame("READY"));
    readyFrame.send(socket);

我尝试在客户端进行如下轮询,但没有成功。

        Poller poller = new Poller(1);
        poller.register(socket, Poller.POLLOUT);
        poller.pollout(0);

【问题讨论】:

  • @user3666197,谢谢,这真的很适合我的目的。

标签: java client-server message-queue zeromq


【解决方案1】:

ZeroMQ 是 Pieter HINTJENS 和 Martin SUSTRIK 团队的杰作。是的,有一些低级的、技术相关的问题,仍然需要一些设计工作,但 ZeroMQ 是稳定且非常成熟的。

系统思考——玩具就像分布式自动机一样工作

是的,SEQ 编程语言的正常工作流程,连续工作(或“只是”并发)突然获得新维度 - 分布式自动机维度。

因此本地工作流程依赖于外部运营方。

ZeroMQ 正式通信模式的每个原始原型都具有人类熟悉的名称:

一个 REQ-第二个 REP-谎言 >
一个 PUB-写,任何人 SUB-只写听
一个 PUSH-另一个 PULL-要接待
每一方都绑定在 PAIR 可以根据需要随时说话和倾听时间>
BROKERDEALERXPUBXSUB等等 p>

这是设计的原因,为什么您的服务器端 REQ-archetype 行为不会收到来自任何其他方的任何下一条消息(是的,那里可能是更多的客户端连接到同一个REQ-transport-class 节点),直到它确实REP-lies(无论是否为空消息)到 REP-侧分布式自动机。

最好的下一步

嗯,朝着这个方向迈进的最好的下一步是恕我直言,以获得更多的全球视野,这对于尝试使用 ZeroMQ 编码的前几件事来说可能听起来很复杂,但如果你 at least jump to the page 265[Code Connected, Volume 1] [available asPdf >>> http://hintjens.wdfiles.com/local--files/main%3Afiles/cc1pe.pdf ],如果不是这样一步一步的阅读。

有史以来最快的学习曲线将是首先在 图 60 重新发布更新图 62 上获得未公开的视图strong> HA 克隆服务器对实现可能的高可用性方法,然后回到根源、元素和细节。

开销:

作为一个小提示,一旦在while(){}-循环“外部”创建轮询器,降低处理开销将是公平和资源明智的,因为没有明显的理由恢复此类元素并重新-一次又一次地为每个循环注册它的服务:

Poller poller      = new Poller(1);                  // new INSTANCE
poller.register( socket, Poller.POLLIN );            // pay COSTS of SETUP
                                                     //     JUST ONCE, HERE
while ( !Thread.currentThread ().isInterrupted () ) {// inf LOOP

    poller.poll();                                   //     POLL !BLOCKING
    if ( poller.pollin( 0 ) ) {                      //     if ITEMS{ ... proc 'em }
    ZMsg zmqMessage  = ZMsg.recvMsg( socket );
    if ( zmqMessage != null )
         zmqMessage.getFirst().getData();
    }
}

无论如何:享受分布式计算的世界!

【讨论】:

    【解决方案2】:

    REP 套接字必须发送回复才能再次接收。 如果您只是想要一种单向通信,您最好使用PUBSUB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2013-02-02
      相关资源
      最近更新 更多