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. ...
随机推荐
- hdu 1491 Octorber 21st
Octorber 21st Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- nyoj 60 谁获得了最高奖学金
谁获得了最高奖学金 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: ...
- web.xml(spring/spring mvc/hibernate)
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" ...
- Web 应用的安全性
Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户授权 ...
- 剑指OFFER之顺时针打印矩阵(九度OJ1391)
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2 ...
- 设计Account 对象如下: private long id; private double balance; private String password; 要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下:
package homework005; public class Account { private long id; private double balance; private String ...
- centos6.2安装jdk7
首先在Vmware下安装好Centos6.2,下载好jdk7文件,tar包安装 1 wget http://download.oracle.com/otn-pub/java/jdk/last-vers ...
- CF 319B Psychos in a Line 【单调队列】
维护一个单调下降的队列. 对于每一个人,只需要找到在他前面且离他最近的可以杀掉他的人即可. #include <cstdio> #include <vector> #inclu ...
- ThinkPHP CURD方法盘点:limit方法
limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多.ThinkPHP的limit方法可以兼容所有的数据库驱动类的. 用法 限制结果数量 例如获取满足 ...
- 产生不重复的随机数TGUID
uses ActiveX; procedure TForm1.BtnNewClick(Sender: TObject);var ID: TGUID; S: string;begin if CoC ...