2013-09-27 31 views
0

我想Zeromq世界您好服務器和客戶端的例子。下面是示例代碼Zeromq如何使一個C++服務器程序,它允許它不等待客戶端請求

// 
// 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; 
} 

的代碼工作正常,我能夠發送請求並得到答覆。

但我希望服務器不應該等待來自客戶端的請求。服務器繼續運行,並且如果來自客戶端的請求發出,它會給出回覆。

我可以在程序中做出什麼改變來達到這個目的。

+1

您可能想了解非阻塞套接字,但我不知道如何爲ZMQ啓用它。 –

回答

0

你可以嘗試ZMQ_PUSH/ZMQ_PULL組合,使客戶爲例請求無阻塞。

如果您想超越hello世界,您可能需要查看Push Framework的架構。讓服務器繼續運行是什麼意思?你是指多線程?很可能你不想這樣做。如果你想擴展你的應用程序到很多的客戶端,你應該可以退房load balancing

服務器套接字將在後臺爲你自己異步收集信息。你通常做的是你在服務器的一個地方連續收集消息,並根據需要將消息反饋給消息進行進一步處理 - 不同步或不同步。

相關問題