信封中通过 TCP 的 XML 消息

问题描述 投票:0回答:1

我的任务是通过 TCP 将机械接口复制到系统中。我的规格如下:

田野 价值 大小(字节) 注释
消息长度+2 2 XML 消息的字节长度 + 2,编码为两字节、大端数字
消息ID 8001 2 消息 ID,编码为两字节、大端数字(固定值)。
留言 XML 消息本身,使用 UTF-8 字符编码。
EOF 0xff 1 消息信封结束(固定值)

我很乐意构建一个可以将“消息”部分发送到端点的应用程序(见下文)。

using System;
using System.Net.Sockets;
using System.Text;
using System.IO;

namespace ClientSocketApp
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                TcpClient client = new TcpClient("172.16.98.155", 12100);
                string messageToSend = "<message type=\"2635\" MSID=\"0\">\r\n<che CHID=\"MACHINE1\" action=\"L\" SPREAD=\"2\">\r\n<position PPOS=\"YARD\" JPOS=\"CTR\" QWGT=\"20000\"/>\r\n</che>\r\n</message>";
                byte[] sendData = Encoding.UTF8.GetBytes(messageToSend);

                NetworkStream stream = client.GetStream();
                stream.Write(sendData, 0, sendData.Length);

                Console.WriteLine("Sending data to server...");
                StreamReader sr = new StreamReader(stream);
                //string response = sr.ReadLine();
                //Console.WriteLine(response);

                stream.Close();

                //client.Close();
                Console.ReadKey();
            }
            catch (Exception e)
            {
                Console.WriteLine("Failed to connect...");
            }
        }
    }
}

如果有人有任何好主意,我正在努力解释长度、ID 和 EOF 的规范。

c# xml tcp
1个回答
0
投票

规范描述了消息框架。 IE。接收者如何知道他已收到整个消息并可以一次性反序列化整个 xml。这意味着流将包含一些二进制值和一个大字符串。

让我们从编写 xml 消息长度开始。大概“一个两字节数字”意味着一个 ushort,让我们创建一个辅助方法来处理大端转换:

private void WriteUshortBigEndian(Stream stream, int value){
  if(value> ushort.MaxValue) throw new Exception ...
  var bytes = BitConverter.GetBytes((ushort)value);
  if(BitConverter.IsLittleEndian){
      Array.Reverse( bytes );
  stream.Write(bytes , 0, 2 );
}
...
WriteUshortBigEndian(stream, sendData.Length);

接下来是消息id,这个好像是固定值8001

WriteUshortBigEndian(stream, 8001);

后面是实际消息:

stream.Write(sendData, 0, sendData.Length);

最后是一个 0xff 字节

strean.WriteByte((byte)0xff);
© www.soinside.com 2019 - 2024. All rights reserved.