消息队列之ZeroMQ(C++)
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <windows.h>
#include<zhelpers.hpp>
using namespace std; DWORD WINAPI MyThread_client(LPVOID lpParamter)
{
zmq::context_t context ();
//建立套接字
zmq::socket_t socket (context, ZMQ_REQ); std::cout << "Connecting to hello world server..." << std::endl;
//连接服务器
socket.connect ("tcp://localhost:5555"); for (int request_nbr = ; request_nbr != ; request_nbr++) {
s_send (socket, "hello");
std::cout << "Client1 Received :" <<s_recv (socket)<< std::endl; Sleep();
}
return ; } DWORD WINAPI MyThread_client1(LPVOID lpParamter)
{
zmq::context_t context ();
//建立套接字
zmq::socket_t socket (context, ZMQ_REQ); std::cout << "Connecting to hello world server..." << std::endl;
//连接服务器
socket.connect ("tcp://localhost:5555"); for (int request_nbr = ; request_nbr != ; request_nbr++) {
s_send (socket, "SB");
std::cout << "Client2 Received :" <<s_recv (socket)<< std::endl; Sleep();
}
return ; } DWORD WINAPI MyThread_servce(LPVOID lpParamter)
{
zmq::context_t context ();
zmq::socket_t socket (context, ZMQ_REP);
//绑定端口
socket.bind ("tcp://*:5555"); while (true) {
std::cout << "Servce Received: "<<s_recv (socket)<< std::endl;
s_send (socket, "world");
}
} int main ()
{ HANDLE hThread1 = CreateThread(NULL, , MyThread_client, NULL, , NULL);
HANDLE hThread2 = CreateThread(NULL, , MyThread_servce, NULL, , NULL); HANDLE hThread3 = CreateThread(NULL, , MyThread_client1, NULL, , NULL); while();
return ;
}
运行结果:
这里我建立了两个客户端和一个服务器,每个都独立运行一个线程。客户端1发了“hello”,客户端2发了“SB”,服务器都能接收到并且返回了world。
2:发布订阅模式(PUB-SUB)
所谓发布订阅,比如天气预报,当很多人订阅之后,中心服务器直接往订阅的人发送就可以了,不需要管对方有没有收到。也就是1对N的模式。这里还有重要的一个概念,频道:跟收音机的频道类似,订阅者设定了频道才能听到该频道的消息
看例程序:
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <windows.h>
#include<zhelpers.hpp>
using namespace std; //订阅1
DWORD WINAPI MyThread_sub1(LPVOID lpParamter)
{
zmq::context_t context();
zmq::socket_t subscriber (context, ZMQ_SUB);
//连接
subscriber.connect("tcp://localhost:5563");
//设置频道B
subscriber.setsockopt( ZMQ_SUBSCRIBE, "A", );
while () { // Read envelope with address
std::string address = s_recv (subscriber);
// Read message contents
std::string contents = s_recv (subscriber); std::cout << "订阅1:[" << address << "] " << contents << std::endl;
}
return ; }
//订阅2
DWORD WINAPI MyThread_sub2(LPVOID lpParamter)
{
zmq::context_t context();
zmq::socket_t subscriber (context, ZMQ_SUB);
//连接
subscriber.connect("tcp://localhost:5563");
//设置频道B
subscriber.setsockopt( ZMQ_SUBSCRIBE, "B", );
while () { // Read envelope with address
std::string address = s_recv (subscriber);
// Read message contents
std::string contents = s_recv (subscriber); std::cout << "订阅2:[" << address << "] " << contents << std::endl;
}
return ; }
//订阅3
DWORD WINAPI MyThread_sub3(LPVOID lpParamter)
{
zmq::context_t context();
zmq::socket_t subscriber (context, ZMQ_SUB);
//连接
subscriber.connect("tcp://localhost:5563");
//设置频道B
// subscriber.setsockopt( ZMQ_SUBSCRIBE, "B", 1);
while () { // Read envelope with address
std::string address = s_recv (subscriber);
// Read message contents
std::string contents = s_recv (subscriber); std::cout << "订阅3:[" << address << "] " << contents << std::endl;
}
return ; }
//发布线程
DWORD WINAPI MyThread_pub(LPVOID lpParamter)
{
// Prepare our context and publisher
zmq::context_t context();
zmq::socket_t publisher(context, ZMQ_PUB);
publisher.bind("tcp://*:5563"); while () {
// Write two messages, each with an envelope and content
s_sendmore (publisher, "A");
s_send (publisher, "We don't want to see this"); Sleep ();
s_sendmore (publisher, "B");
s_send (publisher, "We would like to see this");
Sleep (); }
} int main ()
{
HANDLE hThread1 = CreateThread(NULL, , MyThread_pub, NULL, , NULL);
Sleep();
HANDLE hThread2 = CreateThread(NULL, , MyThread_sub1, NULL, , NULL);
HANDLE hThread3 = CreateThread(NULL, , MyThread_sub2, NULL, , NULL);
HANDLE hThread4 = CreateThread(NULL, , MyThread_sub3, NULL, , NULL);
while();
return ;
}
结果:
消息队列之ZeroMQ(C++)的更多相关文章
- 消息队列库——ZeroMQ
消息队列库——ZeroMQ ZeroMQ(简称ZMQ)是一个基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字. ZMQ是网络通信中新的 ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- zeromq的安装,部署(号称最快的消息队列,消息中间件)
1:Storm作为一个实时处理的框架,产生的消息需要快速的进行处理,比如存在消息队列ZeroMQ里面. 由于消息队列ZeroMQ是C++写的,而我们的程序是运行在JVM虚拟机里面的.所以需要jzmq这 ...
- 消息队列&Celery&RabbitMQ&zeromq
一.消息队列 什么是消息队列? “消息队列”是在消息的传输过程中保存消息的容器. “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象. 消息 ...
- 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...
- 消息队列ZeroMQ
消息队列概念 消息队列技术是分布式应用间交换信息的一种技术.消息队列可以驻留在内存或者磁盘上,队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可以独立的执行,它们不需要知道彼此的位置,或者在 ...
- RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙
消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
- Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
随机推荐
- git clone出现的error: The requested URL returned error: 401 Unauthorized
error: The requested URL returned error: 401 Unauthorized while accessing https://git.oschina.net/.. ...
- BZOJ2802——[Poi2012]Warehouse Store
1.题目巨短,自己看看吧 2.分析:这道题,想了半天dp还是想不到,最后看题解发现是个贪心的思想,我们维护一个堆,如果这个人不能加入就把他和堆上最大的进行比较,然后搞搞就行了 #include < ...
- [BZOJ1251]序列终结者
[BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...
- 跟着百度学PHP[6]超级全局变量
超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用. 参考文献:http://www.runoob.com/php/php-superglobals ...
- java 反序列化PHP
由于本人所在开发的项目,前期是由php完成的,这里需要对数据库中php序列化的字符串进行反序列化. 1.引入maven依赖 <!--反序列化 php--> <dependency&g ...
- 实现放大转场动画 from cocoachina
原文1:http://www.cocoachina.com/ios/20160318/15714.html 原文2:http://ningandjiao.iteye.com/blog/2049105 ...
- 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)
这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...
- 高可用thrift客户池的实现详解
最近,公司要求将组内的thrift客户端组件推广至公司内使用.基本的要求如下: 1.高可用 2.集成名称服务,也就配置文件支持服务发现 3.解耦,客户端和高可用组件解耦,简单来说就是,如果以后要切换其 ...
- 【linux】scp命令
scp的作用是在不同主机之间传输文件. 用法: scp user@host:/path1 path2 说明: 把远程主机host中path1的内容拷贝到当前主机的path2 user是远程主机登陆用户 ...
- 打开eclipse报错
隔了一段时间没用eclipse, 打开之后报错: 从报错上来看是因为java版本太低导致的. 我打开cmd, 运行java -version 后 发现java 版本已经更新到了1.8 然后就有点懵. ...