ZMQ从入门到掌握三

ZMQ从入门到掌握<三>


订阅-发布模式


ZeroMQ的订阅发布模式是一种单向的数据发布,当客户端向服务端订阅消息之后,服务端便会将产生的消息源源不断的推送给订阅者


特点:

1.一个发布者,多个订阅者的关系,1:n;
2.当发布者数据变化时发布数据,所有订阅者均能够接收到数据并处理。
这就是发布/订阅模式。

注:使用SUB设置一个订阅时,必须使用zmq_setsockopt()对消息进行过滤,例如:


说明:发布者使用PUB套接字将消息发送到队列中,订阅者使用SUB套接字从队列中源源不断的接收消息。新的订阅者可以随时加入,但之前的消息是无法接收到的;已有的订阅者可以随时退出;订阅者还可以添加“过滤器”用来有选择性的接收消息。


图例:
在这里插入图片描述

在这里插入图片描述


案例代码:

pub.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include "zmq.h"
 
int main()
{
    void* context = zmq_ctx_new();
    assert(context != NULL);
 
    void* socket = zmq_socket(context, ZMQ_PUB);
    assert(socket != NULL);
 
    int ret = zmq_bind(socket, "tcp://*:5555");
    assert(ret == 0);
 
    int i = 0;
    while(1)
    {
        char szBuf[1024] = {0};
        snprintf(szBuf, sizeof(szBuf), "server i=%d", i);
        ret = zmq_send(socket, szBuf, strlen(szBuf) + 1, 0);
        i++;
 
        //sleep(1);
    }
 
    zmq_close (socket);
    zmq_ctx_destroy (context);
 
    return 0;
}

sub.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include "zmq.h"
#include <thread>

using namespace std;
 
#define TRUE 1
 
void Recv(void* arg)
{
	while(TRUE)
	{
		void* socket = arg;
		printf("into while\n");
		char szBuf[1024] = {0};
		int ret = zmq_recv(socket, szBuf, sizeof(szBuf) - 1, 0);
		if (ret > 0)
		{
			printf("Recv:%s\n", szBuf);
		}
	}
}


void Recv2(void* arg)
{
	while(TRUE)
	{
		void* socket = arg;
		printf("into while\n");
		char szBuf[1024] = {0};
		int ret = zmq_recv(socket, szBuf, sizeof(szBuf) - 1, 0);
		if (ret > 0)
		{
			printf("Recv2:%s\n", szBuf);
		}
	}
}

int main()
{
    printf("Hello world!\n");
 
    void* context = zmq_ctx_new();
    assert(context != NULL);
 
    void* socket = zmq_socket(context, ZMQ_SUB);
    assert(socket != NULL);
 
    int ret = zmq_connect(socket, "tcp://localhost:5555");
    assert(ret == 0);
 
    ret = zmq_setsockopt(socket, ZMQ_SUBSCRIBE, "", 0);
    assert(ret == 0);
	thread t1(Recv,socket);
	thread t2(Recv2,socket);
	/*
    while(1)
    {
        printf("into while\n");
        char szBuf[1024] = {0};
        ret = zmq_recv(socket, szBuf, sizeof(szBuf) - 1, 0);
        if (ret > 0)
        {
            printf("%s\n", szBuf);
        }
    }
 */
	t1.join();
	t2.join();
    zmq_close(socket);
    zmq_ctx_destroy(context);
 
    return 0;
}

makefile

all:pub sub

CXX=g++
CXXFLAGS=-fPIC -std=c++11 -o
LDFLAGS=-lzmq -lpthread

pub:pub.cpp
	$(CXX) pub.cpp $(CXXFLAGS)  pub $(LDFLAGS)

sub:sub.cpp
	$(CXX) sub.cpp $(CXXFLAGS) sub $(LDFLAGS)
	
clean:
	rm -f sub pub 


想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发


DFLAGS)

sub:sub.cpp
$(CXX) sub.cpp $(CXXFLAGS) sub $(LDFLAGS)

clean:
rm -f sub pub


***********

想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:====**C++后台服务器开发**====

*****

发布了197 篇原创文章 · 获赞 68 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Travelerwz/article/details/103221578
zmq