NetMQ(ZeroMQ)Client => Server => Client 模式的实现
ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库。它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(message broker)。该库设计成常见的套接字风格的API。
ZeroMQ是由iMatix公司和大量贡献者组成的社群共同开发的。ZeroQ通过许多第三方软件支持大部分流行的编程语言 。类库提供一些套接字(对传统Berkeley套接字和Unix domain socket的泛化),每一个套接字可以代表一个端口之间的多对多连接。以消息的粒度进行操作,套接字需要使用一种消息模式(message pattern),然后专门为那种模式进行了优化。
如果说ZeroMQ最突出的三个特点是什么? 答案是 快,很快,非常快。相信如果您的单线程队列能够在几秒内完成千万级别的数据入列和出列您一定会有同样的感觉。
NetMQ 是使用c# 对ZeroMQ的实现。
闲话不说了,对于这个消息队列的介绍网上一搜一堆,我这边就讲一下具体的实现吧。
网上大部分的例子都是点对点的 发布=>订阅,通常消息队列的应用是 客户端发布,服务端中转,客户端接收,多对多的形式。发布端和接收端是一体的,打个简单的比喻,QQ群聊天,QQ群号码就是你订阅的主题。同时你自己也是发布端,同理其他成员也订阅了QQ群号码为主题,流程就成了 你发送消息到腾讯服务器,腾讯服务器转发消息到所有的群成员QQ,此时他们是订阅方,你是发布方,反过来群成员发布消息,你也能接收,这时群成员为发布方,你为订阅方,(打个比方,借用一下腾讯的的场景而已,QQ消息的收发不是这样的。)
现在我们来看一下 Client => Server => Client 模式的实现代码
服务端:
static void Main(string[] args)
{
using (var xpubSocket = new XPublisherSocket("@tcp://127.0.0.1:1234"))
using (var xsubSocket = new XSubscriberSocket("@tcp://127.0.0.1:5678"))
{
var proxy = new Proxy(xsubSocket, xpubSocket);
Task.Factory.StartNew(proxy.Start);
Console.WriteLine("服务端启动完成。");
Console.ReadKey();
}
}
客户端:
static void Main(string[] args)
{
//发布服务
PublisherSocket pubSocket = new PublisherSocket();
pubSocket.Connect("tcp://127.0.0.1:5678");
Console.WriteLine("连接消息发布代理服务器...\r\n"); //订阅服务
SubscriberSocket subSocket = new SubscriberSocket();
subSocket.Subscribe("Topic");//订阅主题
subSocket.Connect("tcp://127.0.0.1:1234");
Console.WriteLine("连接消息订阅代理服务器...\r\n"); //发布消息
pubSocket.SendMoreFrame("Topic").SendFrame("Hello World");
Console.WriteLine("主题:Topic,发布消息:Hello World\r\n"); //接收消息
string topic = subSocket.ReceiveFrameString();
string message = subSocket.ReceiveFrameString();
Console.WriteLine(string.Format("主题:{0},订阅消息:{1}\r\n",topic,message));
Console.ReadKey();
}
}
效果演示:

NetMQ(ZeroMQ)Client => Server => Client 模式的实现的更多相关文章
- Consul集群Server+Client模式
Consul集群Server+Client模式 架构示意图 只使用Consul的Server模式有以下2个问题: 因为Consul Server数量受到控制所以压力承载(扩展性)是个问题. Serve ...
- 深入浅出 Redis client/server交互流程
综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...
- Java Client/Server 基础知识
Java的网络类库支持多种Internet协议,包括Telnet, FTP 和HTTP (WWW),与此相对应的Java网络类库的子类库为: Java.net Java.net.ftp Java. ...
- Network client/server
<Beginning Linux Programming_4th> chapter 15 Sockets 1 A simple local client/server 1) clie ...
- Client–server model
Client–server model From Wikipedia, the free encyclopedia The client–server model of computing ] Oft ...
- AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库
AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...
- Linux SocketCan client server demo hacking
/*********************************************************************** * Linux SocketCan client se ...
- Java: server/client 心跳机制实现 示例
心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...
- docker报Error response from daemon: client is newer than server (client API version: 1.24, server API version: 1.19)
docker version Client: Version: 17.05.0-ce API version: 1.24 (downgraded from 1.29) Go version: go1. ...
随机推荐
- soliworks三维机柜布局(四)进入solidworks中三维布线
首先需要在solidworks electrical中创建solidworks装配体文件. 菜单栏:处理--solidworks机柜布局--勾选要创建的装配体--点击确定 在文件列表下右键装配体文件- ...
- 【每天一个Linux命令】10. 用户账号的新建/修改/删除以及密码修改 useradd/usemod/userdel/passwd
在 Linux 系统中,与用户管理有关的文件主要有如下几个:分别是/etc/passwd,/etc/shadow,/etc/gfoup,/etc/gshadow .它们分别与用户的账号,密码,用户组及 ...
- 两个简单方法加速DataGridView
两个简单方法加速DataGridView (2009-03-24 16:57:13) 转载▼ 标签: 杂谈 分类: .NET DataGridView虽然好用,但是如果数据量比较大的话就会出现性能的问 ...
- java的socket 编程
之前在学校的时候,有时间但是总是学不进去,现在工作了,总想多学点东西,但是又是没有时间来学习,只能在工作的闲暇之余,给自己充充电,随着学习的深入,越来月发现Java真的很强大,几乎什么都可以做的,以下 ...
- hadoop安装详解
1.hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem)和MapRe ...
- Eclipse+Maven构建web项目及部署时Maven lib依赖问题的解决
目录 Eclipse中m2e插件构建web项目的步骤 Maven工具构建web项目再导入Eclipse的步骤 [一].Eclipse中m2e插件构建web项目的步骤 第一步:创建项目,按照 New – ...
- TQ210裸机编程(2)——LED流水灯
两个文件start.S和led.c start.S .global _start @声明一个全局的标号 _start: bl main ...
- Linux 基础 —— RPM
http://liaoph.com/linux-rpm/ 这篇文章主要讲 RPM 软件包管理器的使用. 软件包的演变史 最早期时,软件包是一些可以运行的程序组成的集合,可能还要加上若干配置文件和动态库 ...
- MySQL的数据类型(转)
MySQL的数据类型 1.整数 TINYINT: 8 bit 存储空间 SMALLINT: 16 bit 存储空间 MEDIUMINT: 24 bit 存储空间 INT: 32 bit 存储空间 BI ...
- VMware:虚拟机磁盘空间不足怎么办
前言: 虚拟机里一般我们用的虚拟磁盘,在电脑上是一个或多个文件,随着软件和数据的增多,有时也会提示磁盘空间不足. 那么,虚拟机磁盘空间不足如何处理呢? 一:调整磁盘分区大小; 若只是提示相应磁盘分 ...