ZeroMQ Pub-Sub测试代码
ZeroMQ&发布者-订阅者模式
ZeroMQ可以看作是普通socket的高级封装,提供了友好的通信方式。例如,因为底层协议无法一次将数据全部发送过去,使用普通socket发送就需要进行分片处理,非常麻烦,ZeroMQ屏蔽了这些问题。此外,ZeroMQ提供了很多通信模式,可以很方便使用,Pub-Sub就是其中一种。在这一模式中,发布者(pub)只发送信息,订阅者(Sub)从发布的信息中找到自己关注的信息,并接收下来。这一模式用处极其广泛,例如手机上的天气预报等。
Pub端代码
///windows 测试通过
#include <zmq.hpp>
#include <iostream>
#include <random>
#include <string>
#include <windows.h>
int main()
{
zmq::context_t context(1);
zmq::socket_t pub(context, zmq::socket_type::pub);
pub.bind("tcp://*:5556");
std::string cities[] = {"Beijing", "Shanghai", "Guangdong", "Xian"};
std::string wea_type[] = {"sun", "cloud", "rain"};
std::uniform_int_distribution<unsigned> u1(0, 3);
std::uniform_int_distribution<unsigned> u2(0, 2);
std::uniform_int_distribution<int> u3(-50, 50);
std::default_random_engine re;
//weather infor
while (true)
{
std::string city = cities[u1(re)];
std::string wea = wea_type[u2(re)];
int tem = u3(re);
zmq::message_t message(50);
char cdata[50] = { '\0' };
snprintf(cdata, 50, "%s, %s, %d", city.c_str(), wea.c_str(), tem);
message.rebuild(cdata, strlen(cdata));
std::cout << "pub:" << message.to_string() << std::endl;
pub.send(message, zmq::send_flags::none);
Sleep(1000);
}
return 0;
}
Sub端代码
///windows 测试通过
#include <zmq.hpp>
#include <iostream>
#include <sstream>
int main()
{
zmq::context_t context(1);
zmq::socket_t sub(context, zmq::socket_type::sub);
sub.connect("tcp://localhost:5556");
char topic[] = "Guangdong";
sub.set(zmq::sockopt::subscribe, zmq::const_buffer(topic, strlen(topic))); //设置过滤条件
while (true)
{
zmq::message_t message(50);
std::string city, wea;
int tem;
sub.recv(message, zmq::recv_flags::none);
std::istringstream iss(static_cast<char*>(message.data()));
iss >> city >> wea >> tem;
std::cout << "city:" << city << "\tweather:" << wea << "\ttemperature:" << tem << std::endl;
}
return 0;
}
注意:以上代码还是有bug,sub接收的信息最后一位整型数字存在问题,不知道怎么解决…