ZeroMQ REQ-REP模式简介

一、简介

ZMQ是个类似于 Socket 的一系列接口,他跟 Socket 的区别是:普通的 socket 是端到端的(1:1的关系),而 ZMQ 却是可以N:M 的关系,人们对 BSD 套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而 ZMQ 屏蔽了这些细节,让你的网络编程更为简单。ZMQ 用于 node 与 node 间的通信,node 可以是主机或者是进程。

ZMQ 提供了三个基本的通信模型,分别是“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline”, 本文主要介绍“Request-Reply “模型的通信。

二、libzmq安装配置

推荐源码编译安装:
Build steps:

- [libzmq]:(https://github.com/zeromq/libzmq) via cmake. This does an out of source build and installs the build files
- download and unzip the lib, cd to directory

- mkdir build
- cd build
- cmake ..
- sudo make -j4 install


>>libzmp安装的是c的api,若需要使用cpp的api,请将./include/zmq.hpp 拷贝至 /usr/local/inlude **
>>由于C风格字符串是以\0结尾,而其他语言的string并非如此。在zmq通信中,官方建议统一使用cpp std::string的格式,发送接受C风格字符串时候注意转换。因而,当收到一个 message_t的时候,安全的做法应该首先通过size()确定字符串的大小。

二、模型原理

由 Client 发起请求,并等待 Server 回应请求。请求端发送一个简单的 hello,服务端则回应一个 world。请求端和服务端都可以是 1:N 的模型。通常把 1 认为是 Server ,N 认为是 Client 。ZMQ 可以很好的支持路由功能(实现路由功能的组件叫作 Device),把 1:N 扩展为N:M (只需要加入若干路由节点)。如图:

ZeroMQ REQ-REP模式简介_第1张图片

三、Hello World!

Client:首先发送(send)request 指令,在接收(recv)到 reply 指令之前处于阻塞状态

int main (int argc, char** argv)
{
    //  Prepare context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REQ);

    // Assign server 
    socket.connect ("tcp://localhost:5555");

    //  Do 10 requests, waiting each time for a response
    while(1) {
        zmq::message_t request (5));
        memcpy (request.data (), "Hello", 5);
        socket.send (request);
        
        //  Get the reply.
        zmq::message_t reply;
        
        // Block here
        socket.recv (&reply);
        char data[reply.size()+1] = {0};
        memcpy(data, reply.data(), reply.size());
        std::cout << std::string(data, reply.size()) << std::endl;
    }
    return 0;
}

Server:首先接收(recv)request 指令,然后发送(send)reply 指令,在接收到下一条 request 指令前阻塞

int main () {
    //  Prepare 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;

        char data[request.size()+1] = {0};
        memcpy(data, request.data(), request.size());
        std::cout << std::string(data, request.size()) << std::endl;

        //  Wait for next request from client && block here
        socket.recv (&request);

        //  Send reply message
        zmq::message_t reply (6);
        memcpy (reply.data (), "World!", 6);
        socket.send (reply);
    }
    return 0;
}

 

你可能感兴趣的:(ZeroMQ REQ-REP模式简介)