转:https://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);
View Code这样就在数据转发处事器端创建了一个名为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);
View Code在客户端中,用一个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();
View Code