ZMQ的下载及使用
0.简介
网上简介一大堆,个人而言也没怎么看,工作要用,就需要学习。
ZMQ、ZeroMQ:能够快速建立SOCKET,有多种模式可供使用,最开始接触的时候使用的是PUB-SUB模式。
1.下载
工程链接:The ZeroMQ project
1.1 C语言:libzmq
下载源码
直接从当前页面即可下载,如果想下载其他的版本,可以查看各个Release版本,分别下载资源。下载解压后的文件,如下图所示:
备注:
- doc:文档
- include:头文件
- src:源文件
- 其他:不知道
1.2 C++:cppzmq
备注:相关的操作与C++的一致
2.编译
2.1 安装Cmake
编译需要使用CMake,如果没有安装,需要手动安装一下。
CMake下载:Cmake Download
备注:安装相关注意事项,直接百度即可。
安装结果,如下图所示:[命令行不会使用,需要使用gui界面的程序]
2.2 编译
1、打开cmake-gui.exe,选择工程路径以及构建路径
- 工程路径:含有MakeFileList.txt文件的上级文件夹
- 构建路径:输出目录
2、Configure
点击之后,选择相应的构建环境:
选择完成之后,直接finish即可,自动执行configure的过程。
3、Generate
执行generate之后,将会构建工程,工程构建完毕,open project可用:
4、编译工程
open project,打开VS2019,工程较多,需要稍等片刻:
ALL_BUILD工程,右键生成即可。
备注:如果需要Win32版本,直接工程中间修改即可
感觉其中有很多都是测试工程,实际常最后使用的只有一个动态库,以及一个hpp文件
3.使用
3.1 文件说明
使用ZMQ的时候,只需要使用其中的部分文件:
ZMQ源工程目录下:
备注:需要将platform.hpp文件拷贝到src下面,具体路径如下:
copy "\ZMQ\build_4.3.4\platform.hpp" to "\ZMQ\zeromq-4.3.4\src"
ZMQ构建目录下:
具体使用的文件如下:
- bin
- Debug
- libzmq-v142-mt-gd-4_3_4.dll
- lib
- Debug
- libzmq-v142-mt-gd-4_3_4.lib
- libzmq-v142-mt-sgd-4_3_4.lib
3.2 工程中使用
备注:这个lib是两个lib中比较小的那个。
3.3 代码示例
Server
// ZMQ_Test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include <stdio.h>
#include "zmq.h"
#include <string>
//#include "zmq.hpp"
using namespace std;
int main()
{
//server
void* context = zmq_init(1);
// 与客户端通信的套接字
void* responder = zmq_socket(context, ZMQ_REP);
zmq_bind(responder, "tcp://*:5555");
while (1) {
// 等待客户端请求
zmq_msg_t request;
zmq_msg_init(&request);
zmq_msg_recv(&request, responder, 0);
printf("%s\n", (char*)zmq_msg_data(&request));
zmq_msg_close(&request);
// 返回应答
int rCount = 0;
while (rCount < 3) {
++rCount;
printf("我:");
std::string outStr;
getline(cin, outStr);
std::string replyStr = "客服:" + outStr;
int strSize = replyStr.size();
zmq_msg_t reply;
zmq_msg_init_size(&reply, strSize + 1);
memcpy(zmq_msg_data(&reply), replyStr.c_str(), strSize + 1);
if (rCount == 3) {
zmq_msg_send(&reply, responder, 0);
}
else {
zmq_msg_send(&reply, responder, ZMQ_SNDMORE);
}
zmq_msg_close(&reply);
}
}
// 程序不会运行到这里,以下只是演示我们应该如何结束
zmq_close(responder);
zmq_term(context);
return 0;
}
Client
// ZMQ_Test2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "zmq.h"
#include <string>
using namespace std;
int main()
{
std::string userName="DefaultName";
void* context = zmq_init(1);
// 连接至服务端的套接字
printf("请输入地址[格式:tcp://255.255.255.255:5555]: ");
std::string address;
cin >> address;
cin.get();
printf("正在连接至hello world服务端...%s\n",address.c_str());
void* requester = zmq_socket(context, ZMQ_REQ);
int res=zmq_connect(requester, address.c_str());
printf("请输入昵称:");
getline(cin, userName);
if (userName.empty()) {
userName = "DN";
}
int request_nbr;
for (request_nbr = 0; request_nbr != 10; request_nbr++) {
//send
std::string inStr;
printf("我:");
getline(cin, inStr);
std::string sendStr = userName + ":" + inStr;
int strSize = sendStr.size();
zmq_msg_t request;
zmq_msg_init_size(&request, strSize+1);
memcpy(zmq_msg_data(&request),sendStr.c_str(), strSize+1);
int res=zmq_msg_send(&request, requester, 0);
//printf("res=%d\n", res);
zmq_msg_close(&request);
for (int i = 0; i < 3; i++) {
zmq_msg_t reply;
zmq_msg_init(&reply);
zmq_msg_recv(&reply, requester, 0);
printf("%s\n", (char*)zmq_msg_data(&reply));
zmq_msg_close(&reply);
}
}
zmq_close(requester);
zmq_term(context);
return 0;
}
3.4 C++使用
- C++完全兼容C的语法,可以直接使用libzmq的相关库,直接使用C的语法;
- 如果需要使用C++语法,则可直接去cppzmq的仓库,下载最新的zmq.hpp文件,添加到工程中即可;
Note that for using cppzmq, you don’t have to build it at all, it is a header only library. You need a libzmq library (static or shared) for your platform, and link it into your application/library, as described with libzmq itself. Then, you only need to #include “zmq.hpp” (and maybe #include “zmq_addon.hpp”) to use cppzmq.
If you want to develop cppzmq itself and run its tests, please provide details on your environment, in particular the OS, how/where you installed libzmq, and how you ran cmake.