zoukankan      html  css  js  c++  java
  • 网络通信 --> ZMQ安装和使用

    ZMQ安装和使用

      ZMQ 并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在 Socket API 之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的 API 接口

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

      ZMQ 提供了三个基本的通信模型,分别是“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline”,具体内容参见http://news.cnblogs.com/n/154000/

    区别:

      1、zmq套接字是异步的,可以实现特定模式

      2、TCP是一对一,ZeroMQ是多对多的,可以根据套接字类型实现一对多,一对一,多对一,或多对多

      3、ZeroMQ传输消息,TCP传输字节

      4、ZeroMQ 隐藏IO细节,ZeroMQ不在乎目的是否存在

      5、ZeroMQ可以往多个节点发送数据,可以从多个节点接收数据

    一、安装

    在ubuntu上安装并测试成功,过程见下:

      (1)下载最新的ZeroMQ:http://download.zeromq.org/

      (2)解压:tar -xvf zeromq-4.1.2.tar.gz  

      (3)编译

    ./configure 提示

    checking for sodium... no
    configure: error: Package requirements (libsodium) were not met

    解决办法,暂时先屏蔽掉这个库:

    ./configure --prefix=/home/libdev/zmq --without-libsodium    //红色部分路径可以去掉
    make
    make install

    安装成功。

    测试程序

    server端:

    #include <stdio.h>                                                                                                                                                          
    #include <unistd.h>                                                                                    
    #include <string.h>                                                                                    
    #include <assert.h>                                                                                    
    #include <zmq.h>                                                                                     
                                                                                                           
    int main (void)                                                                                        
    {                                                                                                      
        //  Socket to talk to clients                                                                      
        void *context = zmq_ctx_new ();                                                                    
        void *responder = zmq_socket (context, ZMQ_REP);                                                   
        int rc = zmq_bind (responder, "tcp://*:5555");                                                     
        assert (rc == 0);                                                                                  
                                                                                                           
        while (1) {                                                                                        
            char buffer [10];                                                                              
            zmq_recv (responder, buffer, 10, 0);                                                           
            printf ("Received Hello
    ");                                                                   
            sleep (1);          //  Do some 'work'                                                         
            zmq_send (responder, "World", 5, 0);                                                           
        }                                                                                                  
        return 0;                                                                                          
    }

    client端:

    //  Hello World client                                                                                                                                                      
    #include <zmq.h>                                                                                       
    #include <string.h>                                                                                    
    #include <stdio.h>                                                                                     
    #include <unistd.h>                                                                                    
                                                                                                           
    int main (void)                                                                                        
    {                                                                                                      
        printf ("Connecting to hello world server…
    ");                                                   
                                                                                                           
        /*创建一个新的上下文*/                                                                             
        void *context = zmq_ctx_new ();                                                                    
        void *requester = zmq_socket (context, ZMQ_REQ);                                                   
        /*通过tcp协议,5555端口,连接本机服务端*/                                                          
        zmq_connect (requester, "tcp://localhost:5555");                                                   
                                                                                                           
        int request_nbr;                                                                                   
        for (request_nbr = 0; request_nbr != 10; request_nbr++) {                                          
            char buffer [10];                                                                              
            printf ("Sending Hello %d…
    ", request_nbr);                                                  
            zmq_send (requester, "Hello", 5, 0);                                                           
            zmq_recv (requester, buffer, 10, 0);                                                           
            printf ("Received World %d
    ", request_nbr);                                                   
        }                                                                                                  
                                                                                                           
        zmq_close (requester);                                                                             
        zmq_ctx_destroy (context);                                                                         
                                                                                                           
        return 0;                                                                                          
    }

    编译:注意加上动态库

    gcc hwserver_.c -o hwserver -lzmq
    gcc hwclient_.c -o hwclient -lzmp

    运行:出现如下错误

    [root@localhost hwserver]# ./hwserver 
    ./hwserver: error while loading shared libraries: libzmq.so.5: cannot open shared object file: No such file or directory

    解决办法:加上zmq.so的路径:

    sudo find ./ -depth -name "libzmq.so" -print  //找出动态库路径
    
    cd /etc
    sudo vim ld.so.conf   //
    include /usr/local/lib   //把zmq.so的路径加进来
    ldconfig   //记住执行这句话

    然后启动hwserver和hwclient,执行结果如下所示:

    参考:http://www.cnblogs.com/Anker/p/4706244.html

  • 相关阅读:
    学习Spring Boot:(八)Mybatis使用分页插件PageHelper
    学习Spring Boot:(七)集成Mybatis
    学习Spring Boot:(六) 集成Swagger2
    学习Spring Boot:(五)使用 devtools热部署
    学习Spring Boot:(四)应用日志
    学习Spring Boot:(三)配置文件
    学习Spring Boot:(二)启动原理
    学习Spring Boot:(一)入门
    Java8 新特性Stream 的学习和使用方法
    简易promise的实现(二)
  • 原文地址:https://www.cnblogs.com/jeakeven/p/5303505.html
Copyright © 2011-2022 走看看