1

对 zmq_poll 的 api 中的警告感到困惑:“zmq_send() 函数将清除套接字上的所有未决事件。因此,如果您使用 zmq_poll() 监视套接字上的输入,请在输出之前使用它,并在每次 zmq_poll() 调用后处理所有事件。”

我不明白那是什么意思。由于事件是电平触发的。如果我调用zmq_send()then zmq_poll(),则套接字缓冲区中的任何待处理消息都应zmq_poll立即再次触发。为什么需要“zmq_poll在输出之前也使用它()”或“在每次 zmq_poll() 调用之后处理所有事件”?

4

1 回答 1

1

我明白你的意思,文档令人困惑。这是一个使用带有轮询器的客户端DEALER套接字(来自asyncsrv)在 Java 中的简单测试。服务器向客户端发送 3 条消息。客户端轮询并输出它收到的每条消息。我已send()在客户端中添加以测试您的理论。假设send()清除轮询器,我们希望客户端只输出一条消息的接收:

服务器

public static void main(String[] args) {
    Context context = ZMQ.context(1);
    ZMQ.Socket server = context.socket(ZMQ.ROUTER);
    server.bind("tcp://*:5555");

    server.sendMore("clientId");
    server.send("msg1");

    server.sendMore("clientId");
    server.send("msg2");

    server.sendMore("clientId");
    server.send("msg3");
}


客户

public void run() {
    socket = context.socket(ZMQ.DEALER);
    socket.setIdentity("clientId".getBytes());
    socket.connect("tcp://localhost:5555");

    ZMQ.Poller poller = new ZMQ.Poller(1);
    poller.register(socket, ZMQ.Poller.POLLIN);

    while (true) {
        poller.poll();
        if (poller.pollin(0)) {
            String msg = socket.recvStr(0);
            System.out.println("Client got msg: " + msg);
            socket.send("whatever", 0);
        }
    }
}

输出...

Client got msg: msg1
Client got msg: msg2
Client got msg: msg3

根据结果​​,doingsend()不会清除轮询器socket,原因应该很明显。我们将轮询器配置为POLLIN,这意味着轮询器侦听到 的入站消息socket。这样做时socket.send(),它会创建出站消息,轮询器未在侦听这些消息。

希望能帮助到你...

于 2013-08-14T17:05:55.803 回答