ZeroMQ 基础篇

文/wangwei 2015-10-31 02:43:00

简介

ZeroMQ是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库,它提供的套接字可以在多种协议中传输消息,并且透明的支持多种通信方式,主要包括:线程间通信,进程间通信,跨主机通信等。ZeroMQ强调消息收发模式,比如常见的订阅模式、分发模式、请求-应答等等。

安装

下载源码

    如下,我下载的是4.1.3版本,可以到官网上找最新版本的源代码下载
    wget http://download.zeromq.org/zeromq-4.1.3.tar.gz

编译安装

    1. tar xzvf zeromq-4.1.3.tar.gz
    2. cd zeromq-4.1.3
    3. ./configure
        在./configure的过程中,可能会检测到缺少某软件或者库,缺少什么就安装什么。
        比如我在configure的过程中提示如下错误:
        ``
        configure: error: Package requirements (libsodium) were not met:

        No package 'libsodium' found
        ``
        在centos下执行:yum install libsodium-devel,这个依赖就解决了。
    4. make && make install 完成编译安装
    5. 创建/etc/ld.so.conf.d/zmq.conf
       加入/usr/local/lib ,这个目录是zeroMQ动态库所在的目录。
    6. sudo ldconfig 

测试简单请求-应答模式:

  1. 例子代码:

    zmq-server.c

    #include <zmq.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    int main (void)
    {
        void *context = zmq_init (1);
    void *responder = zmq_socket (context, ZMQ_REP);
    zmq_bind (responder, "tcp://*:8888");
    
    while (1) {
        zmq_msg_t request;
        zmq_msg_init (&amp;request);
        zmq_recvmsg (responder, &amp;request, 0);
        printf ("recv request\n");
        zmq_msg_close (&amp;request);
    
        sleep (1);
    
        zmq_msg_t reply;
        zmq_msg_init_size (&amp;reply, 9);
        memcpy (zmq_msg_data (&amp;reply), "response", 9);
        zmq_sendmsg (responder, &amp;reply, 0);
        zmq_msg_close (&amp;reply);
    }
    zmq_close (responder);
    zmq_term (context);
    return 0;
    
    }

    zmq-client.c

    #include <zmq.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main (void)
    {
        void *context = zmq_init (1);
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://127.0.0.1:8888");
    
    int request_nbr;
    for (request_nbr = 0; request_nbr &lt;= 10; request_nbr++) {
        zmq_msg_t request;
        zmq_msg_init_size (&amp;request, 7);
        memcpy (zmq_msg_data (&amp;request), "Request", 7);
        printf ("sending request %d...\n", request_nbr);
        zmq_sendmsg (requester, &amp;request, 0);
        zmq_msg_close (&amp;request);
    
        zmq_msg_t reply;
        zmq_msg_init (&amp;reply);
        zmq_recvmsg (requester, &amp;reply, 0);
    
        int size = zmq_msg_size (&amp;reply);
        char *string = (char *) malloc(size + 1);
        memcpy (string, zmq_msg_data (&amp;reply), size);
        printf ("recv  %s\n", string);
        zmq_msg_close (&amp;reply);
    }
    zmq_close (requester);
    zmq_term (context);
    return 0;
    
    }
  2. 编译

    gcc zmq-server.c -o zmq-server -lzmq
    gcc zmq-client.c -o zmq-client -lzmq
    
  3. 测试

    运行./zmq-server 以及 ./zmq-client 即可看到应答和请求消息
    

python使用zeroMQ

  1. 安装依赖

    pip install pyzmq
    
  2. 测试简单请求-应答模式:

    zmq-client.py

    import zmq
    context = zmq.Context()
    
    print "Connecting to zmq-req-resp server..."
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://127.0.0.1:8888")
    
    for request in range (0,10):
    print "Sending request ", request
    socket.send ("request" + str(request))
    
    message = socket.recv()
    print "Received response ", request, "[", message, "]"
    

    zmq-server.py

    import zmq
    import time
    
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.bind("tcp://*:8888")
    
    while True:
    message = socket.recv()
    print "Received request: ", message
    
    time.sleep (1)
    
    socket.send("response")
    
知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

最新文章 全部