【转】C# 使用消息队列,包括远程访问

出处:http://www.cnblogs.com/80X86/p/5557801.html

近期做一个小的功能需求,用到了队列,用的时候出了很多问题,现在总结一下,希望能对有需要的人提供帮助。

我的需求很简单,就是多个客户端连接到我的一个小型的数据转发服务器上,开始使用的是Socket通信实现这个功能,一旦数据服务器接收到来自不同客户端发来的消息,就对这些消息进行处理(我这里是将数据接收到后再转发到另一个服务器上),但考虑到客户端是每隔一个很短的时间周期向服务器发送信息,并且连接客服端数量比较多的时候,担心会产生并发访问的问题,也希望避免 数据转发服务器 频繁地从多个不同线程获取信息而出现其他未知问题,所以在处理客户端向数据转发服务器发送信息的时候采取队列的方式。

一般情况下,使用MSMQ,要先安装消息服务,这个直接百度就行;

在VS里添加 Messaging引用,就可以使用MessageQueue这个类了;接下来就要思考清楚你的数据(消息)的流向问题,之前因为自己对队列的错误认识,对到底在哪创建队列,队列的消息又由谁去发送和接收没有弄清除,还有参考的一些写得不是太清晰地博文,绕了好大一圈,所以今天在这里以我自己的项目需求为例子,说明 1、如何创建队列 2、如何向队列发送消息 3、 如何获取队列中的消息

首先、创建队列:根据我的需求,我要通过Socket通信将信息发送至数据转发服务器,因此为了避免并发访问问题的产生,消息队列应当建立在数据转发服务器上;

       MessageQueue myqueue = null;
       string queuepath = @".\private$\queuedemo";

            if (!MessageQueue.Exists(queuepath))
            {
                myqueue = MessageQueue.Create(queuepath);
            }
            myqueue = new MessageQueue(queuepath);

这样就在数据转发服务器端创建了一个名为queuedemo的消息队列;从客户端要发送的消息就保存在这个队列里,你可以通过计算机管理->服务和应用下的消息队列中看到你创建的queuedemo队列,private$关键字是说明队列为专用队列,如果没有这个关键字还要配置域服务器,还是挺麻烦,这个还是借助百度吧,前面的“.”代表创建的队列目录是本机,这个队列一旦创建成功,就是系统的事了,接下来要做的就是你怎么去把消息写进这个队列,或者读取队列的值 这里要特别注意不要将queuepath路径字符串写成

string queuepath = @"FormatName:Direct=TCP:192.168.1.153\private$\queuedemo";

这样写的话是用于远程计算机对这个队列进行访问的,因为MessageQueue的Create()和Exisit()方法是没办法去识别上述FormatName格式的,还有要确保Create()函数要被执行了之后再用MessageQueue实例去引用;这样服务器端队列的创建就完成了;

在客户端中,向队列发送信息;

string s = "客户端往队列里发送的信息");
            System.Messaging.Message msg = new System.Messaging.Message();
            msg.Body = s;
            msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });            MessageQueue mq = new MessageQueue(@"FormatName:Direct=TCP:192.168.1.153\private$\queuedemo");
            mq.Send(msg);

在客户端中,用一个MessageQueue实例指向服务器本机上创建的队列路径,这时,MessageQueue实例的构造函数里的路径就一定要用FormatName格式,指明是TCP通信还是HTTP还是Machine如我上面代码所示,然后调用Send()方法,将消息写进队列,这个要求发送的对象要以序列化的方式写进去,所以要设置formatter,这里用的是XmlMessageFormatter 还有BinaryMessageFormatter等等 注意保存你消息的 消息体Body是Object类型的 因此可以将你写的任何一个类的对象发送至消息队列

在服务器中接收消息队列

MessageQueue mq = new MessageQueue(@".\private$\queuedemo");

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            Thread th = new Thread(() =>
                {
                    while (true)
                    {
                        System.Messaging.Message msg = mq.Receive();
                        if (msg != null)
                        {
                            MessageBox.Show(msg.Body.ToString());
                        }

                    }
                });
            th.IsBackground = true;
            th.Start();

在本机上可以新创建一个队列实例指向本机的队列,然后按照之前约定的序列化格式反序列化消息体所以将新的队列实例的foarmatter属性赋值为发送时的formatter属性如代码所示,这个时候就直接用Receive()得到消息体,然后对消息体里的信息做处理,我这里是开启一个线程显示队列的消息,只要有新的消息写入,我就在消息框中输出

这个时候可能客户端无法向远程服务器成功发送消息,原因基本权限问题 服务器的消息队列的权限没有对未验证的客户端开放  你要在服务器队列里分配对应权限 如果你想读取队列的内容 还需要加系统变量

问题解决办法

1. 服务器端

    • 服务器上消息队列权限设置:给ANONYMOUS LOGON赋予所有权限;

    • 修改服务器的注册表,允许非验证客户端访问

这样客户端就可以读取服务器里的队列信息了 当然一般业务逻辑上不这么做 因为他只负责发送消息 ,综上,就是使用消息队列 跨服务器读写的 最基本的用法

时间: 2024-08-27 06:42:05

【转】C# 使用消息队列,包括远程访问的相关文章

RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaMq等,而部分数据库如Re

消息队列及常见消息队列介绍

原文链接:https://cloud.tencent.com/community/article/129032 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaM

关于消息队列的技术选型

https://cloud.tencent.com/developer/article/1006035 导语 : 消息队列是分布式系统中重要的组件,在很多生产环境如商品抢购等需要控制并发量的场景下都需要用到.最近组内需要做流水server的选型升级,这里对消息队列及常见的消息队列进行了一次调研,整理了相关资料,分享给大家. 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制

分布式通信技术之消息队列

消息队列的基本原理 消息队列是基于队列实现的,存储具有特定格式的消息数据.消息队列包括生产者,消息队列以及消费者. RocketMQ的原理与工作机制 架构图 NameServer Cluster:名字服务器集群,类似于kafka中的zookeeper,提供分布式协调与管理的功能 Producer Cluster:生产者集群,负责接收用户数据,将数据发布到消息队列中心Broker cluster Consumer Cluster:消费者集群,负责从Broker获取消息进行消费 Broker Clu

C# 使用消息队列,包括远程访问

近期做一个小的功能需求,用到了队列,用的时候出了很多问题,现在总结一下,希望能对有需要的人提供帮助. 我的需求很简单,就是多个客户端连接到我的一个小型的数据转发服务器上,开始使用的是Socket通信实现这个功能,一旦数据服务器接收到来自不同客户端发来的消息,就对这些消息进行处理(我这里是将数据接收到后再转发到另一个服务器上),但考虑到客户端是每隔一个很短的时间周期向服务器发送信息,并且连接客服端数量比较多的时候,担心会产生并发访问的问题,也希望避免 数据转发服务器 频繁地从多个不同线程获取信息而

.NET 使用消息队列,包括远程访问

之前的项目用到了队列,现在总结一下,下面有非常详细的DEMO,希望能对有需要的人提供帮助. 我的需求很简单,就是多个客户端连接到我的一个小型的数据转发服务器上,开始使用的是Socket通信实现这个功能,一旦数据服务器接收到来自不同客户端发来的消息,就对这些消息进行处理(我这里是将数据接收到后再转发到另一个服务器上),但考虑到客户端是每隔一个很短的时间周期向服务器发送信息,并且连接客服端数量比较多的时候,担心会产生并发访问的问题,也希望避免 数据转发服务器 频繁地从多个不同线程获取信息而出现其他未

Python并发编程-RabbitMq消息队列

消息中间件 --->就是消息队列 异步方式:不需要立马得到结果,需要排队 同步方式:需要实时获得数据,坚决不能排队 subprocess 的Q也提供不同进程之间的沟通 应用场景: 买票,抢购 堡垒机批量发送文件 Centos6.x系统编译安装RabbitMQ 一.系统环境 [[email protected] ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [[email protected] ~]# uname -r 2.6.32-

Windows消息队列

一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个"消息队列",即应用程序队列,用来存放该程序可能 创建的各种窗口的消息.应用程序中含有一段称作"消息循环"的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中.  二 Windows为当前执行的每个Windows程序维护一个「消息队列」.在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中.程序通过执行一块称之为「消息循

C#分布式消息队列 EQueue 2.0 发布啦

前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地址:https://github.com/tangxuehua/equeue EQueue相关文档:http://www.cnblogs.com/netfocus/category/598000.html EQueue Nuget地址:http://www.nuget.org/packages/eq