zeromq发布-订阅模式简单使用

zeromq作为网络通讯库,是支持发布、订阅机制的,但是又与MQTT等发布、订阅概念有所不同。

由于ZMQ通讯是基于CS模型的,没有服务程序做中转,也就意味着订阅端作服务端和发布端作服务端是不同的。

如下图所示,每个框表示一个进程,zmq发布、订阅机制有如下性质:

服务程序作发布者 只能跟作订阅者的客户端程序通信,服务程序作订阅者只能跟作发布者的客户端程序通信。

订阅者作客户端,只能跟一个作发布者的服务程序通信。发布者作客户端,只能跟一个作订阅者的服务程序通信。

zeromq发布-订阅模式简单使用_第1张图片

上述情况为只建立一路socket连接的情况,如过一个进程监听多个端口号,便可既作发布端,又做订阅端了。具体组合方式就要视不同需求而定了。在这就不做详细说明了,有兴趣可以下载ZeroMQ的电子书看一下,其中讲到了许多经典组合模型,和zeromq各种详细使用方法。

ZeroMQ云时代极速消息库电子书下载:

https://pan.baidu.com/s/1_KhuBtZ9p8jnPZWlXADWMg

 

如下为在Ubuntu上编写的测试代码:

#include 
#include 
#include 
#include "zmq.h"

int main(int argc, char *argv[])
{		
    if(argc >= 4 && !strcmp("-sub",argv[2])) // 如果是订阅
    {
		/*************************** 订阅   ***************************/
		void *context = zmq_ctx_new();
		void *subscriber = zmq_socket(context, ZMQ_SUB);
		
		if(!strcmp("-server",argv[1]))          //作服务端
			zmq_bind(subscriber, "tcp://*:12345");   
		else if(!strcmp("-client",argv[1]))		//作客户端
			zmq_connect(subscriber, "tcp://localhost:12345");
		else
		{
			printf("Please add true param:\n"
			   "For example:\n"
			   "-server -sub [topic1] [...]\n"
			   "-client -sub [topic1] [...]\n"
			   "-server -pub [topic] [msg]\n"
			   "-client -pun [topic] [msg]\n");
			return 0;
		}
			
		int i=0;
		for(i=3; i

如下为测试方法和测试结果:

订阅者作服务程序:

zeromq发布-订阅模式简单使用_第2张图片

发布者作服务程序:

zeromq发布-订阅模式简单使用_第3张图片

测试程序用到了libzmq库,和zmq.h头文件。库的编译可参考:https://blog.csdn.net/fangye945a/article/details/84845325

也可下载我的工程代码编译测试:https://github.com/fangye945a/zeromq_pub_sub_test.git

 

MQTT在订阅时支持通过 “#“ 符号通配订阅多个主题。无意中发现zeromq也是默认支持这一特性的。

比如 要订阅 "hello/123"   "hello/456"  "hello/789"这几个主题,直接订阅"hello/"主题就行了。如下为测试结果:

zeromq发布-订阅模式简单使用_第4张图片

运行测试程序订阅主题"123",然后运行程序向主题"1234"发布消息,订阅端也能够收到主题为"1234"的消息。

 

你可能感兴趣的:(C语言学习,Linux基础学习,C++学习)