1

我正在为服务器和客户端尝试 Zeromq Hello world 示例。下面是示例代码

//
//  Hello World client in C++
//  Connects REQ socket to tcp://localhost:5555
//  Sends "Hello" to server, expects "World" back
//
#include <zmq.hpp>
#include <string>
#include <iostream>

int main ()
{
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REQ);

    std::cout << "Connecting to hello world server…" << std::endl;
    socket.connect ("tcp://localhost:5555");

    //  Do 10 requests, waiting each time for a response
    for (int request_nbr = 0; request_nbr != 10; request_nbr++) {
        zmq::message_t request (6);
        memcpy ((void *) request.data (), "Hello", 5);
        std::cout << "Sending Hello " << request_nbr << "…" << std::endl;
        socket.send (request);

        //  Get the reply.
        zmq::message_t reply;
        socket.recv (&reply);
        std::cout << "Received World " << request_nbr << std::endl;
    }
    return 0;
} 

和服务器代码

//
//  Hello World server in C++
//  Binds REP socket to tcp://*:5555
//  Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <unistd.h>

int main () {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        //  Wait for next request from client
        socket.recv (&request);
        std::cout << "Received Hello" << std::endl;

        //  Do some 'work'
        sleep (1);

        //  Send reply back to client
        zmq::message_t reply (5);
        memcpy ((void *) reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

代码运行良好,我能够发送请求并获得回复。

但是我希望服务器不应该等待来自客户端的请求。服务器继续运行,如果来自客户端的请求来,它会给出回复。

我可以在程序中进行哪些更改来实现这一点。

4

2 回答 2

0

您需要使用线程来执行此操作。对于 Boost 线程的示例 http://thisthread.blogspot.fr/2011/08/multithreading-with-zeromq.html

于 2013-09-27T09:43:07.167 回答
0

您可以尝试ZMQ_PUSH/ZMQ_PULL组合以使客户端请求非阻塞。

如果你想超越 hello world,你可能想看看Push Framework的架构。让服务器继续运行是什么意思?你是说多线程吗?很可能你不想这样做。如果您想将应用程序扩展到大量客户端,您可能应该检查负载平衡

服务器套接字将在后台自行为您异步收集消息。您通常所做的是在服务器的一个位置串行收集消息,并根据需要将反应发送到消息以进行进一步处理 - 异步或非异步。

于 2013-09-27T09:52:07.927 回答