案例一
发布者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);