zeromq的使用

Python ZeroMQ入门 通常需要用到ZeroMQ的人应该已经具备比较深的编程知识,所以有个问题就是目前能找到的大多数入门教程对小白不够友好。 所以我最近在学的时候,顺便做些记录。 就不摆概念定义了,百度一下就有。而且刚刚学可能也看不懂,容易打击信心,所以直接从例子开始吧。 接下来会用三个例子,介绍最基本的模式和用法。 第一个例子 我们想实现Hello World这个经典功能。但是ZeroMQ不是一个编程语言,是... 阅读详情

1. 下载zeromq

 C: git clone http://github.com/zeromq/libzmq;

2. 编译

编译zmqlib:启动开始菜单 vs2017下的x64 Native Tools Command Prompt for VS 2017。

mkdir -p src\libzmq\build;

cd src\libzmq\build;

cmake ..

vs2017打开ZeroMQ.sln。编译。

3.使用:

A.publisher-subscriber模式

server:

#include <zmq.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#if (!defined (WIN32))
#   include <sys/time.h>
#endif
#if (defined (WIN32))
#   include <windows.h>
#endif
int main (void)
{
    //  Prepare our context and publisher
    void *context = zmq_ctx_new ();
    void *publisher = zmq_socket (context, ZMQ_PUB);
    int rc = zmq_bind (publisher, "tcp://*:5556");
    assert (rc == 0);
    //  Initialize random number generator
    srand((unsigned) time (NULL));
    while (1) {
        //  Get values that will fool the boss
        int zipcode, temperature, relhumidity;
        zipcode     = rand()%(100000);
        temperature = rand()%(215) - 80;
        relhumidity = rand()%(50) + 10;
        //  Send message to all subscribers
        char update [20];
        sprintf (update, "%05d %d %d", zipcode, temperature, relhumidity);
        zmq_send (publisher, update, strlen (update), 0);
    }
    zmq_close (publisher);
    zmq_ctx_destroy (context);
    return 0;
}

 


client:

#include <zmq.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#if (!defined (WIN32))
#   include <sys/time.h>
#endif
#if (defined (WIN32))
#   include <windows.h>
#endif
int main (int argc, char *argv [])
{
    //  Socket to talk to server
    printf ("Collecting updates from weather server...\n");
    void *context = zmq_ctx_new ();
    void *subscriber = zmq_socket (context, ZMQ_SUB);
    int rc = zmq_connect (subscriber, "tcp://localhost:5556");
    assert (rc == 0);
    //  Subscribe to zipcode, default is NYC, 10001
    const char *filter = (argc > 1)? argv [1]: "10001 ";
    rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE,
                         filter, strlen (filter));
    assert (rc == 0);
    //  Process 100 updates
    int update_nbr;
    long total_temp = 0;
    for (update_nbr = 0; update_nbr < 100; update_nbr++) {
        char buffer [256];
        int size = zmq_recv (subscriber, buffer, 255, 0);
        if (size == -1)
            continue;
        buffer[size] = '\0';
        int zipcode, temperature, relhumidity;
        sscanf (buffer, "%d %d %d",
            &zipcode, &temperature, &relhumidity);
        total_temp += temperature;
    }
    printf ("Average temperature for zipcode '%s' was %dF\n",
        filter, (int) (total_temp / update_nbr));
    zmq_close (subscriber);
    zmq_ctx_destroy (context);
    return 0;
}

B.request-response模式:

server:

#include <zmq.h>

#include <stdio.h>
#include <string.h>
#include <assert.h>
#if (!defined (WIN32))
#   include <sys/time.h>
#endif
#if (defined (WIN32))
#   include <windows.h>
#endif
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\n");
        Sleep (1);          //  Do some 'work'
        zmq_send (responder, "World", 5, 0);
    }
    return 0;
}

 

client:

#include <zmq.h>
#include <string.h>
#include <stdio.h>
int main (void)
{
    printf ("Connecting to hello world server...\n");
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    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...\n", request_nbr);
        zmq_send (requester, "Hello", 5, 0);
        zmq_recv (requester, buffer, 10, 0);
        printf ("Received World %d\n", request_nbr);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}


C. ROUTER -DEALER模式
server端:

qyhzmqserverworker.h:

#ifndef QYHZMQSERVERWORKER_H
#define QYHZMQSERVERWORKER_H

#include <zmq.hpp>

class QyhZmqServerWorker
{
public:
    QyhZmqServerWorker(void *ctx);
    void work();
private:
    zmq::context_t *ctx_;
    zmq::socket_t worker_;
};

#endif // QYHZMQSERVERWORKER_H


qyhzmqserverworker.cpp:

#include "qyhzmqserverworker.h"

QyhZmqServerWorker::QyhZmqServerWorker(void *ctx):
    ctx_((zmq::context_t *)ctx),
    worker_(*ctx_, ZMQ_REP)
{

}

void QyhZmqServerWorker::work()
{
    worker_.connect("inproc://workers");

    try {
        while (true) {
            zmq::message_t msg;
            zmq::message_t copied_msg;
            worker_.recv(&msg);
            //处理结尾没有\0的问题
            printf("recv:%s\n",std::string((char*)msg.data(),msg.size()).c_str());
            copied_msg.copy(&msg);
            worker_.send(copied_msg);
        }
    }
    catch (std::exception &e) {}
}


qyhzmqserver.h:

#ifndef QYHZMQSERVER_H
#define QYHZMQSERVER_H

#include <vector>
#include <thread>
#include <memory>
#include <functional>

#include <zmq.hpp>


class QyhZmqServer
{
public:
    QyhZmqServer();

    //线程数量
    enum{ MAX_THREAD = 10 };

    //线程中初始化的入口
    void run();
private:
    zmq::context_t ctx_;
    zmq::socket_t frontend_;
    zmq::socket_t backend_;
};

#endif // QYHZMQSERVER_H

 

qyhzmqserver.cpp:

#include "qyhzmqserver.h"
#include "qyhzmqserverworker.h"

QyhZmqServer::QyhZmqServer():
    ctx_(1),
    frontend_(ctx_, ZMQ_ROUTER),
    backend_(ctx_, ZMQ_DEALER)
{

}

void QyhZmqServer::run()
{
    frontend_.bind("tcp://*:5555");
    backend_.bind("inproc://workers");

    std::vector<QyhZmqServerWorker *> worker;
    std::vector<std::thread *> worker_thread;

    for (int i = 0; i < MAX_THREAD; ++i)
    {
        //一个新的工人
        worker.push_back(new QyhZmqServerWorker((void *)&ctx_));

        //启动一个线程,执行这个工人的 work函数
        worker_thread.push_back(new std::thread(std::bind(&QyhZmqServerWorker::work, worker[i])));
        worker_thread[i]->detach();
    }

    //执行代理操作
    try {
        zmq::proxy(frontend_, backend_, nullptr);
    }
    catch (std::exception &e) {}

    for (int i = 0; i < MAX_THREAD; ++i) {
        delete worker[i];
        delete worker_thread[i];
    }
}

 

main.cpp:

#include "qyhzmqserver.h"

int main(int argc, char *argv[])
{
    QyhZmqServer server;
    std::thread t(std::bind(&QyhZmqServer::run, &server));
    t.detach();
    getchar();
    return 0;
}

 

CLIENT端:
main.cpp:

#include <vector>
#include <thread>
#include <memory>
#include <functional>

#include <zmq.hpp>
#include "zhelpers.hpp"

class client_task {
public:
    client_task()
        : ctx_(1),
          client_socket_(ctx_, ZMQ_REQ)
    {}

    void start() {

        client_socket_.connect("tcp://localhost:5555");

        int timeout = 1000;
        zmq_setsockopt (client_socket_, ZMQ_RCVTIMEO, &timeout, sizeof(timeout));
        zmq_setsockopt (client_socket_, ZMQ_SNDTIMEO, &timeout, sizeof(timeout));

        int request_nbr = 0;

        //这里出现异常,就直接退出了线程!
        try {
            while (true) {
                std::stringstream ss;
                ss<<"request :"<< ++request_nbr;
                std::string data = ss.str();

                zmq::message_t s(data.c_str(),data.length());
                client_socket_.send(s);
                zmq::message_t m;
                client_socket_.recv(&m);
                printf("recv:%s\n",std::string((char *)m.data(),m.size()).c_str());
                Sleep(1000);
            }
        }
        catch (std::exception &e) {}

    }

private:
    zmq::context_t ctx_;
    zmq::socket_t client_socket_;
};

int main (void)
{
    client_task ct1;
    client_task ct2;
    client_task ct3;

    std::thread(std::bind(&client_task::start, &ct1)).detach();
    std::thread(std::bind(&client_task::start, &ct2)).detach();
    std::thread(std::bind(&client_task::start, &ct3)).detach();

    getchar();
    return 0;
}


 
对subscriber的简单封装,以供大家参考。解决了多线程调用的问题,并且可以自由 开始停止。实现了优雅的启动停止。
qyhzmqsubscriber.h

#ifndef QYHZMQSUBSCRIBER_H
#define QYHZMQSUBSCRIBER_H

#include <functional>
#include <thread>
#include <zmq.hpp>

class QyhZmqSubscriber
{
public:
    //回调绑定
    typedef std::function<void (std::string)> QyhZmqSubscriberCallback;

    QyhZmqSubscriber(const std::string _url, QyhZmqSubscriberCallback _subcallback);
    ~QyhZmqSubscriber();

    //开始订阅
    void start();

    //停止订阅
    void stop();

private:
    void messageloop();
    static void messagethread(void *arg);
private:
    volatile bool isStop;
    std::thread msgThread;
    zmq::context_t* context;
    zmq::socket_t* subscriber;
    std::string url;
    QyhZmqSubscriberCallback subcallback;
};

#endif // QYHZMQSUBSCRIBER_H


qyhzmqsubscriber.cpp

#include "qyhzmqsubscriber.h"
#include "global.h"

QyhZmqSubscriber::QyhZmqSubscriber(const std::string _url, QyhZmqSubscriberCallback _subcallback):
    url(_url),
    subcallback(_subcallback),
    isStop(true),
    context(NULL)
{
}

QyhZmqSubscriber::~QyhZmqSubscriber()
{
    stop();
}

//开始订阅
void QyhZmqSubscriber::start()
{
    if(!isStop)return ;//运行中
    isStop=false;
    msgThread = std::thread(&QyhZmqSubscriber::messagethread, this);
}

//停止订阅
void QyhZmqSubscriber::stop()
{
    if(isStop)return ;//已停止
    isStop = true;
    delete context;
    if(msgThread.joinable())
        msgThread.join();
}

void QyhZmqSubscriber::messagethread(void *arg)
{
    ((QyhZmqSubscriber *)arg)->messageloop();
}

void QyhZmqSubscriber::messageloop()
{
    //非停止订阅的状态
    context = new zmq::context_t(1);
    subscriber = new zmq::socket_t(*context,ZMQ_SUB);
    subscriber->connect(url);
    subscriber->setsockopt(ZMQ_SUBSCRIBE, "", 0);

    while(!isStop)
    {
        zmq::message_t message;
        try{
            subscriber->recv(&message);
        }catch(std::exception& e){
            //被终止时,会抛出异常
        }
        if(isStop)break;

        std::string str = std::string(static_cast<char*>(message.data()), message.size());
        if(subcallback==nullptr){
            continue;
        }else{
            subcallback(str);
        }
    }
    delete subscriber;
}


main.cpp

#include <iostream>
#include "qyhzmqsubscriber.h"

class LogSubscriber
{
public:
    LogSubscriber():sub(NULL)
    {

    }
    ~LogSubscriber()
    {
        if(sub){
            delete sub;
            sub = NULL;
        }
    }
    void init()
    {
        if(sub)
        {
            delete sub;
            sub = NULL;
        }

        //配置参数
        std::string url = "tcp://localhost:5555";
        QyhZmqSubscriber::QyhZmqSubscriberCallback subcallback = std::bind(&LogSubscriber::onSub, this, std::placeholders::_1);
        sub = new QyhZmqSubscriber(url,subcallback);
    }
    void startSub()
    {
        sub->start();
    }
    void stopSub()
    {
        sub->stop();
    }
private:
    void onSub(std::string msg)
    {
        //your msg process
        std::cout<<msg<<std::endl;
    }
private:
    QyhZmqSubscriber *sub;
};


int main(int argc, char const *argv[])
{
    LogSubscriber logsub;
    logsub.init();
    bool quit = false;
    while(!quit){
        char c;
        std::cin>>c;
        switch(c){
        case 's':logsub.startSub();break;
        case 't':logsub.stopSub();break;
        case 'q':quit=true;break;
        }
    }
    return 0;
}


运行结果截图

 
---------------------  
作者:jsqinyinghao  
来源:优快云  
原文:https://blog.youkuaiyun.com/qinyinghao/article/details/79000977?utm_source=copy  
版权声明:本文为博主原创文章,转载请附上博文链接!

zeroMq的使用 ZeroMQ简介: ZeroMQ是一种基于消息队列的多线程网络库.提供跨越多种传输协议(TCP:传输控制协议,当传输出现错误时,能自动予以纠正;UDP:用户数据包协议,当传输出现错误时会将错误信息丢弃;)的套接字,ZeroMQ是一个可伸缩层,可并行运行,分散在分布式系统间. zeroMQ在设计上主要采用了以下几个高能性的特征: 1.无锁的队列模型 2.批量处理的算法 3.多核下的线程绑定,无... 阅读详情

相关推荐

ZeroMQ下载、编译和使用

下载地址:https://github.com/zeromq/libzmq/releases 我下载的是最新版zeromq-4.2.5.zip 解压后,进入builds文件夹, 我在windows上运行的,用的编译器是vs2015,进入msvc文件夹后,直接用对应工程的文件,直接编译就行。 测试: 编译后,会生成对应版本的,比如是release版本还是debug版本,32位,还是...

斧冰 1万+

ZeroMQ接口函数之 :zmq_recv – 从一个socket上接收一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_recv zmq_recv(3)        ØMQ Manual - ØMQ/4.1.0 Name zmq_recv – 从一个socket上接收一个消息帧 Synopsis int zmq_recv (void *socket, void *buf, size_t len, int flags...

weixin_34290096的博客 1292

zeromq安装配置使用

1 介绍 官方文档: ZeroMQ官⽅⽂档⽹址:http://zguide.zeromq.org/page:all 源码下载地址:http://download.zeromq.org/ 2 安装依赖库 1 基本依赖 apt-get install libtool apt-get install pkg-config apt-get install build-essential apt-get install autoconf apt-get install automake 2 加密库依赖 git cl

Aaron.无剑 1516

zmq_send与zmq_recv

详细介绍zmq_send和 zmq_recv在C语言中的详细用法

轩宇的博客 2585

C#如何调用ZeroMQ

自己写的C#调用zeromq,希望有人能够用得着,其它的应该可以借用下Libzmq.cs [StructLayout(LayoutKind.Sequential)] public unsafe struct zmq_msg_t { public fixed ushort _[32]; } public enum Socket_Type

xcolin的专栏 8175

zeroMQ编程实例

1、安装zeroMQ wget http://download.zeromq.org/zeromq-4.1.2.tar.gz tar -xvzf zeromq-4.1.2.tar.gz cd zeromq-4.1.2.tar.gz ./configure --without-security make && make install 或者: git clone https://github.

The Coding World 1万+

一个使用zmq_recv 接收 5555端口的demo

这个程序会一直运行,接收来自5555端口的消息,并打印出来。每接收到一个消息,它会等待1秒,然后发送一个"World"的回复。分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za。

ALex_zry的博客 329

【ZMQ C/C++ 教程】深入浅出:ZeroMQ中的zmq_recv与zmq_msg_recv解析

在探讨 ZeroMQ(零消息队列)的核心概念和机制之前,我们首先需要了解它的基础理念和它在现代计算中的重要性。ZeroMQ是一个高性能的异步消息库,用于在分布式或并发应用中实现消息传递和通信。在这一章节中,我们将探讨ZeroMQ的基础概念,并从心理学的角度分析为什么消息传递在软件开发中如此关键。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3757

zmq源码阅读 —— zmq_send()和zmq_recv()

int zmq_recv (void *s_, void *buf_, size_t len_, int flags_) { if (!s_ || !((zmq::socket_base_t*) s_)->check_tag ()) { errno = ENOTSOCK; return -1; } zmq_msg_t msg; // 创建消息

bluegreen315的专栏 6340

期权定价模型系列[11]三叉树期权定价[trinomial model ]

三叉树期权定价方法简介

xiaowu1997的博客 1847

win11本地部署openclaw实操第1集

OpenClaw 是一款开源、本地优先、可自托管的 AI 智能体(AI Agent)网关 / 自动化框架,核心是让 AI 从 “只聊天、给建议” 变成 “能在你电脑上真做事” 的数字助手。

weixin_44626085的博客 7131

【ZeroMQ】ZeroMQ入门

消息队列与ZeroMQ【push-pull】 模型与 【pub-sub】 模型的区别 【push-pull】 模型与 【pub-sub】 模型的区别 push-pull模型中,client发的消息,不同server接收指定的msg进行消费。类似于多线程从全局队列取消息模型。 pub-sub模型中,client发的消息,不同的server均接收所有的msg进行消费。 ...

Leoh的博客 3087

UsualToolCMS-验证码绕过漏洞复现

本文以UsualToolCMS为靶场,复现了验证码绕过漏洞

小小小屿屿屿的博客 922

ZeroMQ使用教程

简介: ZeroMQ简称ZMQ,它对socket编程进行了封装,通俗的说,它就像一个框架一样,对socket lib进行了很好的封装,让socket编程变得更加简单。 ZMQ采用消息队列的方式对socket的包进行管理,它支持多线程,同时ZMQ是开源的,你可以在不同的Linux内核架构上缩减ZMQ模块,这在ARM嵌入式上非常有利。 ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”,目前还未成功。 ZMQ不是消息队列服务器,是一个基于消息队列模式的Socket库。 ZMQ的特

17岁boy的博客 7285

从零到一:龙芯杯参赛全攻略(含北理工学长经验PDF、B站培训视频与开源代码合集)

本文详细介绍了龙芯杯全国大学生计算机系统能力大赛的参赛全攻略,包括资源整合、技能树构建、团队协作和避坑指南。提供北理工学长经验PDF、B站培训视频与开源代码合集,帮助参赛者从零基础到站上领奖台。重点解析如何高效获取优质资源、避开新手常见陷阱及构建可落地的学习路径,助力普通学生系统学习CPU设计。

weixin_26802933的博客 542

Smali语言基础语法

定义、声明、调用 Smali数据类型 定义:与Java相同,Smali中也有一套数据类型体系,且该体系实质上是同Java一一对照的。 示例1:Smali——Java数据类型对照表 PS:如上图所示,Smali语言中的数据类型的关键词基本上为Java中同名数据类型的首字母大写,需要着重记忆的例外为:1.long类型的关键词为大写J;2.boolean类型的关键词为大写Z;3.数组的关键词为左半边中括号[;4.object类型(各种类)的关键词为大写L加上该类的全类名路径,路径中的层级用/分割。

aketoshknight的博客 1万+

C++之ZeroMQ的使用

zeromq官网的使用教程很详细,这里主要介绍两种常使用的模式。 Request/Reply (请求应答模式) 这种模式和网络API请求一样,先向一地址的发送请求,然后等待服务器返回对应的数据或者状态,服务器在后端一直监听发过来的请求,然后返回对应的数据即可。 这里代码都是cppzmq的封装的。 void sendMsg() { int port=5555; std::cout &...

@way 7763

GFPS技术原理(一)-简介

GFPS(谷歌快速配对服务)利用BLE技术简化设备配对流程,相比传统方式大幅提升用户体验。首次配对时,设备广播包含型号ID和安全密钥的BLE信号,手机检测后弹出配对通知,用户点击即可完成安全连接并将设备与Google账户绑定。该技术支持跨设备同步、电量显示、找回设备等功能,后续配对更加便捷。GFPS通过BLE实现快速发现、一键配对和安全连接,结合Google后端服务提供元数据支持,已成为出海设备的认证标准。其核心优势在于简化操作步骤并增强功能性,特别适合非技术用户群体。

十多年蓝牙协议软件开发,擅长蓝牙协议分析 2062

zeromq php,php使用zeromq

Zeromq是个啥玩意?Connect your code in any language, on any platform.Carries messages across inproc, IPC, TCP, TPIC, multicast.Smart patterns like pub-sub, push-pull, and router-dealer.High-speed asynchrono...

weixin_28730549的博客 239

STM32F4 Flash数据的保存和读取。

STM32F4 Flash数据的保存和读取。

张一西的博客 9216

2018安徽省青少年信息学奥林匹克(AHOI)初中组

12 种合法的排列分别为:1, 3, 2, 4, 2, 3, 1, 4, 3, 1, 4, 2, 3, 2, 4, 1, 1, 3, 4, 2, 2, 3,4,1,1,4,2,3, 2,4,1,3, 4,1,3,2, 4,2,3,1, 1,4,3,2, 2,4,3,1。分为 2 组,一组的队员实力值是{4, 5, 2, 3},一组是{-4, -3, -5},其中最小的组人数为 3,可以发现没有比 3 更优的分法了。[0, 1, 1, 2]同样不是合法的分组方案,因为出现了两个实力值为 1 的选手。

weixin_42358969的博客 1143

浅析ZeroMQ

ZeroMQ号称是“史上最快的消息队列”,基于c语言开发的,实时流处理sorm的task之间的通信就是用的zeroMQ。 引用官方说法,“ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是“成为标准网络协议栈的一部...

AudiFashion的博客 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

小心使用zeromq

1.关于介绍zeromq的就不说了,可以自己去看官方guide很详细 2.主要说下在使用过程中需要注意的地方 1)使用如果使用c++的接口的时候,在你自己的类中或者apache模块中 需要将zmq::context_t 对象定义在zmq::socket_t对象的前面,这样可以保证销毁的顺序 2)使用sub-pub时候,如果sub没有调用setsockopt设置过滤项(设置NULL则

chlaws的专栏 9951

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

zeromq

在C++的ZeroMQ应用中处理消息超时未消费的问题,通常意味着你需要在发送方实现一个机制,以便跟踪哪些消息已发送但在预定的时间内未被消费(即未收到消费确认)。在C++的ZeroMQ应用中处理消息重发逻辑,主要涉及到检测消息是否成功送达(基于之前讨论的消息确认机制)并在未确认的情况下重发消息。首先,定义一个简单的消息协议,比如每次发送消息后,接收方需要回送一个确认消息(ACK)。通过实现这样的机制,你可以确保你的ZeroMQ应用能够处理消息超时未消费的情况,从而提高整体的消息传递可靠性。

llg3189609554的博客 1062

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Qt 学习之路】在 Qt 使用 ZeroMQ

今天是大年初一,先给大家拜个年,祝各位阖家欢乐,身体安康,万事如意。言归正传,最近调研了很多消息中间件,推荐一款比较好用的中间件 ZeroMQ,今天也把在 Qt 上如何使用 ZeroMQ 分享下。ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。

沙师弟专栏 5108

VC 下使用zeroMQ

1. VC++环境 zeromq编译 1a.下载libzmq 4.2.2 版本 https://github.com/zeromq/libzmq   1b.打开 libzmq-4.2.2\builds\msvc\vs2015\libzmq.sln 编译 libzmq-4.2.2\bin\Win32\Debug\v140\dynamic 生成 libzmq.dll libzmq.lib...

wxynj的博客 1107
上一篇: google protobuf使用
下一篇: Makefile和Cmake的联系与区别
zero_china
博客等级 码龄16年 10粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值