概要
C#通过读取队列中数据截取自己想要的,通过队列来发送消息,XML文件格式传输来进行交互
获取数据可以同正则表达式来截取想要的数据
安装MSMQ
- 首先打开此地电脑,点击计算机打开卸载或更改程序
- 点击启用或关闭Windows功能,下载Microsoft消息队列
C#读取和写入Demo演示
- 搭建的小Demo
- Demo可以模拟客户服务器来发送消息,客户端自动接收信息和截取数据,可以进行发送
- 可以通过点击 1.此电脑右击打开管理 2.服务器和应用程序 3.消息队列中专用队列,来看队列消息和队列日志
C#代码分析
- 使用代码来创建队列
MessageQueue queue;//服务器 string path = ".\\Private$\\lps-to-tester"; MessageQueue queueReceive;//本机 string pathReceive = ".\\Private$\\tester-to-lps"; public Form1() { InitializeComponent(); logText = AddItem; } private void CreateMessageQueue() { if(MessageQueue.Exists(path)) { queue = new MessageQueue(path); } else { queue = MessageQueue.Create(path); } if (MessageQueue.Exists(pathReceive)) { queueReceive = new MessageQueue(pathReceive); } else { queueReceive = MessageQueue.Create(pathReceive); } AsyncReceiveMessage();//创建接收服务器函数 }
- 绑定服务器回调函数
public void AsyncReceiveMessage() { try { //这里使用了委托,当接收消息完成的时候就执行MyReceiveCompleted方法 queue.ReceiveCompleted += new ReceiveCompletedEventHandler(MyReceiveCompleted); queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(XmlNode) }); queue.BeginReceive();//启动一个没有超时时限的异步操作 } catch (Exception ex) { logText("MSMQ调用失败" + ex.Message); } } public void MyReceiveCompleted(object source, ReceiveCompletedEventArgs asyncResult) { try { MessageQueue mq = (MessageQueue)source; XmlDocument doc = new XmlDocument(); doc.Load(asyncResult.Message.BodyStream); logText("接收" + doc.InnerXml); XmlDocument xml = ConvertStringToXmlDocument(doc.InnerXml.ToString()); XmlNode node = xml.SelectSingleNode("request"); foreach (XmlNode xmlNode in node.ChildNodes) { value = xmlNode.Attributes["bsn"].Value; value1 = xmlNode.Attributes["barcode"].Value; break; } textBox2.Text = value; textBox3.Text = value1; mq.BeginReceive(); } catch (MessageQueueException ex) { logText("MSMQ接收消息失败"); } logText("MSMQ接收成功"); }
- 模拟服务器发送函数
private void SendMessage() { try { XmlDocument xml = new XmlDocument(); //创建XML声明对象 XmlDeclaration xmlDeclaration = xml.CreateXmlDeclaration("1.0", "UTF-8", null); //将声明对象添加到XML文档 xml.AppendChild(xmlDeclaration); XmlElement xmlStudents = xml.CreateElement("request"); xml.AppendChild(xmlStudents); XmlElement xmlStu = xml.CreateElement("job"); xmlStu.SetAttribute("bsn", "123"); xmlStu.SetAttribute("barcode", "LH"); xmlStudents.AppendChild(xmlStu); System.Messaging.Message message = new System.Messaging.Message(); message.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); message.Body = xml; queue.Send(message); } catch (Exception ex) { logText("Msmq发送失败" + ex.Message); return; } logText("服务器发送成功"); }
- 客户端发送
private void button3_Click(object sender, EventArgs e) { try { XmlDocument xml = new XmlDocument(); //创建XML声明对象 XmlDeclaration xmlDeclaration = xml.CreateXmlDeclaration("1.0", "UTF-8", null); //将声明对象添加到XML文档 xml.AppendChild(xmlDeclaration); XmlElement xmlStudents = xml.CreateElement("result"); xml.AppendChild(xmlStudents); XmlElement xmlStu = xml.CreateElement("job"); xmlStu.SetAttribute("bsn", textBox2.Text); xmlStu.SetAttribute("result", this.textBox1.Text); xmlStu.SetAttribute("barcode", textBox3.Text); xmlStudents.AppendChild(xmlStu); System.Messaging.Message message = new System.Messaging.Message(); message.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); logText(xml.InnerXml); message.Body = xml; queueReceive.Send(message); } catch (Exception ex) { logText("客户端"+ex.Message); return; } logText("客户端发送成功"); }
小结
队列(Queue)是一种先进先出(FIFO)的数据结构。这意味着最先进入队列的元素会最先被移除,而最后进入队列的元素会最后被移除。队列通常具有两个基本操作:入队(enqueue),将元素添加到队列的末尾;出队(dequeue),从队列的头部移除元素。这种结构类似于排队等候服务的情况,先到先得。