我的任务是通过 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 的规范。
规范描述了消息框架。 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);