ZeroMQ 配置(ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信)

  • 简述

    ZeroMQ号称是“史上最快的消息队列”,基于c语言开发的,实时流处理sorm的task之间的通信就是用的zeroMQ。

    引用官方说法,“ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,

    他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。

    但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一层封装。

    ZMQ让编写高性能网络应用程序极为简单和有趣。” 确实,

    它跟RabbitMQ,ActiveMQ之类有着相当本质的区别,

    ZeroMQ根本就不是一个消息队列服务器,更像是一组底层网络通讯库,

    对原有的Socket API加上一层封装,是我们操作更简便。使用时只需要引入相应的jar包即可。


下文包括linux和Windows两种配置

  • Linux步骤如下:

1)下载zeromq的源代码,ZeroMQ的官方网址:http://zeromq.org/    

    百度网盘的下载地址 : http://pan.baidu.com/s/1mg61em0 

    ZMQ API 的 百度网盘 下载地址 : http://pan.baidu.com/s/1jGDqXfS

    :在本文写作时,ZMQ版本已经升级到4.1.0,不过影响没多大

2)解压源文件

tar zxf zeromq-4.0.3.tar.gz

3)

 3.1进入zmq目录并进行编译和安装

cd zeromq-4.0.3

 3.2执行配置文件

./configure

 3.3 进行编译

make

 3.4 安装zmq

make install

4)现在开始使用zmq进行网络通信

 4.1接收端代码

复制代码
 1 //包含zmq的头文件 
 2 #include <zmq.h>
 3 #include "stdio.h"
 4 
 5 int main(int argc, char * argv[])
 6 {
 7     void * pCtx = NULL;
 8     void * pSock = NULL;
 9     const char * pAddr = "tcp://*:7766";
10 
11     //创建context,zmq的socket 需要在context上进行创建 
12     if((pCtx = zmq_ctx_new()) == NULL)
13     {
14         return 0;
15     }
16     //创建zmq socket ,socket目前有6中属性 ,这里使用dealer方式
17     //具体使用方式请参考zmq官方文档(zmq手册) 
18     if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
19     {
20         zmq_ctx_destroy(pCtx);
21         return 0;
22     }
23     int iRcvTimeout = 5000;// millsecond
24     //设置zmq的接收超时时间为5秒 
25     if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < 0)
26     {
27         zmq_close(pSock);
28         zmq_ctx_destroy(pCtx);
29         return 0;
30     }
31     //绑定地址 tcp://*:7766 
32     //也就是使用tcp协议进行通信,使用网络端口 7766
33     if(zmq_bind(pSock, pAddr) < 0)
34     {
35         zmq_close(pSock);
36         zmq_ctx_destroy(pCtx);
37         return 0;
38     }
39     printf("bind at : %s\n", pAddr);
40     while(1)
41     {
42         char szMsg[1024] = {0};
43         printf("waitting...\n");
44         errno = 0;
45         //循环等待接收到来的消息,当超过5秒没有接到消息时,
46         //zmq_recv函数返回错误信息 ,并使用zmq_strerror函数进行错误定位 
47         if(zmq_recv(pSock, szMsg, sizeof(szMsg), 0) < 0)
48         {
49             printf("error = %s\n", zmq_strerror(errno));
50             continue;
51         }
52         printf("received message : %s\n", szMsg);
53     }
54 
55     return 0;
56 }
复制代码

 4.2发送端代码

复制代码
 1 //包含zmq的头文件 
 2 #include <zmq.h>
 3 #include "stdio.h"
 4 
 5 int main(int argc, char * argv[])
 6 {
 7     void * pCtx = NULL;
 8     void * pSock = NULL;
 9     //使用tcp协议进行通信,需要连接的目标机器IP地址为192.168.1.2
10     //通信使用的网络端口 为7766 
11     const char * pAddr = "tcp://192.168.1.2:7766";
12 
13     //创建context 
14     if((pCtx = zmq_ctx_new()) == NULL)
15     {
16         return 0;
17     }
18     //创建socket 
19     if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
20     {
21         zmq_ctx_destroy(pCtx);
22         return 0;
23     }
24     int iSndTimeout = 5000;// millsecond
25     //设置接收超时 
26     if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iSndTimeout, sizeof(iSndTimeout)) < 0)
27     {
28         zmq_close(pSock);
29         zmq_ctx_destroy(pCtx);
30         return 0;
31     }
32     //连接目标IP192.168.1.2,端口7766 
33     if(zmq_connect(pSock, pAddr) < 0)
34     {
35         zmq_close(pSock);
36         zmq_ctx_destroy(pCtx);
37         return 0;
38     }
39     //循环发送消息 
40     while(1)
41     {
42         static int i = 0;
43         char szMsg[1024] = {0};
44         snprintf(szMsg, sizeof(szMsg), "hello world : %3d", i++);
45         printf("Enter to send...\n");
46         if(zmq_send(pSock, szMsg, sizeof(szMsg), 0) < 0)
47         {
48             fprintf(stderr, "send message faild\n");
49             continue;
50         }
51         printf("send message : [%s] succeed\n", szMsg);
52         getchar();
53     }
54 
55     return 0;
56 }
复制代码

5)在CentOS下编译通过,记得要加zmq的链接库 -lzmq

1 gcc -o recv recv.c -lzmq
2 gcc -o send send.c -lzmq

6)在机器192.168.1.2上运行recv程序,在同一个局域网的另一台机器(同一台机器也可以)上运行send程序,结果如下

 6.1接收端

复制代码
 1 $ ./recv 
 2 bind at : tcp://*:7766
 3 waitting...
 4 received message : hello world :   0
 5 waitting...
 6 received message : hello world :   1
 7 waitting...
 8 received message : hello world :   2
 9 waitting...
10 received message : hello world :   3
11 waitting...
12 received message : hello world :   4
13 waitting...
14 received message : hello world :   5
15 waitting...
复制代码

 6.2 发送端

复制代码
 1 $ ./send 
 2 Enter to send...
 3 send message : [hello world :   0] succeed
 4 
 5 Enter to send...
 6 send message : [hello world :   1] succeed
 7 
 8 Enter to send...
 9 send message : [hello world :   2] succeed
10 
11 Enter to send...
12 send message : [hello world :   3] succeed
13 
14 Enter to send...
15 send message : [hello world :   4] succeed
16 
17 Enter to send...
18 send message : [hello world :   5] succeed
复制代码

7)结束语

以上是zmq最基本的网络通讯实例,在此基础上可以进行更复杂的设计,写出一些网络聊天、文件传输等的网络软件。

如何在Windows上使用ZeroMQ请看这里:http://www.cnblogs.com/fengbohello/p/4369082.html

 

更多 ZeroMQ API :http://www.cnblogs.com/fengbohello/p/4230135.html 



  • Windows 配置

在Windows环境下使用ZMQ

  3.1)安装Windows环境下的ZMQ开发库,可以到ZMQ官网进行下载,或者到百度网盘进行下载

    x86版本 http://pan.baidu.com/s/1qWI82wk

    x64版本 http://pan.baidu.com/s/1hqiWSXu

    下载->解压->安装

    我的ZMQ安装路径是 : D:\Program Files\ZeroMQ 4.0.4

  3.2)使用ZMQ链接库

  3.2.1)我用的是dev-cpp,新建一个工程。

    

  3.2.2)建立一个命令行项目:

    

  3.2.3)设置工程编译时需要的头文件目录和链接库目录

    

  编译时的链接库目录如下图:

    

  头文件目录如下图:

    

    

    

  需要用到的链接库,如下图:

    

  3.2.4)本文需要两个进程进行配合,接收端在windows环境下,发送端在Linux环境下。接收端的代码和发送端的代码都在上一篇文章里面:《ZeroMQ实例-使用ZMQ(ZeroMQ)进行局域网内网络通信》。将文章里接收端代码拷贝到我们当前的工程文件里。发送端放到另一台Linux目录里,并修改代码里的要连接的服务端IP为你的当前Windows 系统的IP。

  3.2.5)在当前工程里,按F9开始编译:

    

  编译成功。接下来按F10运行试试看:

    

  3.2.6)运行失败,找不到运行时链接库。需要把运行时链接库拷贝到程序所在的目录下:

    

  拷贝完成后,如下:

    

  3.2.7)按F10,运行windows下的接收端程序;在linux机器上运行发送端程序,结果如下:

    

  截图显示我的windows程序运行情况(左边),和我远程连接的linux机器的运行情况(右边)。


  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值