我正在为服务器和客户端尝试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;
}
“守则”工作正常我可以发送请求并获得回复。
但我希望服务器不要等待来自客户端的请求。服务器继续运行,如果来自客户端的请求,则给出回复。
我可以在程序中做出哪些改变来实现这一目标。
答案 0 :(得分:0)
您需要使用线程来执行此操作。 有关Boost线程的示例 http://thisthread.blogspot.fr/2011/08/multithreading-with-zeromq.html
答案 1 :(得分:0)
您可以尝试ZMQ_PUSH/ZMQ_PULL
组合,使客户端请求无阻塞。
如果你想超越hello world,你可能想看看Push Framework的架构。让服务器继续运行是什么意思?你的意思是多线程吗?很可能你不想这样做。如果您想将应用程序扩展到许多客户端,您应该查看load balancing
服务器套接字将在后台为您自动异步收集消息。你通常做的是你在服务器的一个地方串行收集消息,然后根据需要将反应发送到消息中进行进一步处理 - 异步或不同步。