NetMQ(ZeroMQ)Client => Server => Client 模式的实现

ØMQ (也拼写作ZeroMQ0MQZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库。它提供一个消息队列, 但是与面向消息的中间件不同,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("连接消息发布代理服务器...
");

            //订阅服务
            SubscriberSocket subSocket = new SubscriberSocket();
            subSocket.Subscribe("Topic");//订阅主题
            subSocket.Connect("tcp://127.0.0.1:1234");
            Console.WriteLine("连接消息订阅代理服务器...
");        

            //发布消息
            pubSocket.SendMoreFrame("Topic").SendFrame("Hello World");
            Console.WriteLine("主题:Topic,发布消息:Hello World
");

            //接收消息
            string topic = subSocket.ReceiveFrameString();
            string message = subSocket.ReceiveFrameString();
            Console.WriteLine(string.Format("主题:{0},订阅消息:{1}
",topic,message));
            Console.ReadKey();
        }
    }

效果演示:

原文地址:https://www.cnblogs.com/MuNet/p/5571160.html