ZMQ发布订阅模型

案例一

发布者Publisher(server)

// server.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace zmq;
int main() {
    context_t context(1);
    socket_t socket(context, ZMQ_PUB);
    socket.bind("tcp://*:5555");

    for ( int i= 0;i< 10;i++) {
        this_thread::sleep_for(std::chrono::seconds(1));
        message_t message(5);
        memcpy(message.data(), "Hello", 5);
        socket.send(message, send_flags::none);
        cout << "Sent 'Hello'" << std::endl;
    }
    return 0;
}

订阅者Subscribers(client)

// client.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
using namespace std;
using namespace zmq;
int main() {
    context_t context(1);
    socket_t socket(context, ZMQ_SUB);
    socket.connect("tcp://localhost:5555");
    socket.setsockopt(ZMQ_SUBSCRIBE, "", 0);

    while (true) {
        message_t message;
        socket.recv(message, recv_flags::none);
        //cout << "Received: " << static_cast<char*>(message.data()) << endl;
        cout << "Received: " << message.to_string() << endl;
    }
    return 0;
}

编译

g++ -o server server.cpp `pkg-config --cflags --libs libzmq`
g++ -o client client.cpp `pkg-config --cflags --libs libzmq`

在这里插入图片描述

订阅者程序步骤

连接发布者

context_t context(1);
    socket_t socket(context, ZMQ_SUB);
    socket.connect("tcp://localhost:5555");

设置订阅过滤器

socket.setsockopt(ZMQ_SUBSCRIBE, "", 0);

函数参数

ZMQ_SUBSCRIBE:

这是一个常量,表示这个套接字选项是用于设置订阅过滤器的。在 ZeroMQ 的发布-订阅模式中,订阅者(subscriber)套接字需要订阅一个或多个特定的消息主题,以便只接收与这些主题匹配的消息。

过滤字符串"":

这是订阅过滤器的字符串。在这个例子中,传递了一个空字符串,这意味着订阅者将订阅所有可用的消息。如果这里指定了一个非空字符串,那么订阅者只会接收与该字符串匹配的消息。

过滤字符串长度0:

这是第三个参数,表示订阅过滤器字符串的长度。由于这里传递了一个空字符串,所以长度是 0

接受消息

在发布订阅模型中,发布者只负责发布消息,不在乎订阅者收没收到,而订阅者只负责接受自己想要的消息,也不在乎发布者发布的是什么消息。

message_t message;
socket.recv(message, recv_flags::none);

发布者程序步骤

连接端口

context_t context(1);
socket_t socket(context, ZMQ_PUB);
socket.bind("tcp://*:5555");

发布消息

在发布订阅模型中,发布者只负责发布消息,不在乎订阅者收没收到。

message_t message(5);
memcpy(message.data(), "Hello", 5);
socket.send(message, send_flags::none);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值