我希望这是获得良好答案的好日子。我有将数据发送到TCP服务器的代码。我可以发送数据,但是我不知道如何包含标题。标头应如何的准则如下
设备与XML接口之间的通信使用以报头开头的TCP消息来指示消息的数据段的长度。此标头必须在所有发送到XML接口的消息之前,并且将在来自XML接口的所有TCP响应的开始处发送。
如果消息长度小于2 ^ 16-1或65535,则将使用两个字节的标头。
标头的第一个字节包含消息长度(不包括此标头)与256的商。第二个字节包含此除法的其余部分。这两个值都以二进制形式表示为0到255(字节0x00到0xFF)之间的无符号整数值。
如果消息长度大于或等于216-1或65535字节,则将使用六字节的标头。
在这种情况下,应发送字节0xFF 0xFF,后跟四个字节的长度指示符,即总共六个字节。
现在我所拥有的如下,并且您可以看到它不能解决标题问题。基本上这是我的问题。
private static void main2(String hostname, int port, String message)
{
String response = String.Empty;
TcpClient client = new TcpClient(hostname, port);
Console.WriteLine(message);
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream,Encoding.UTF8);
writer.AutoFlush = false;
writer.WriteLine(message);
writer.Flush();
writer.Close();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
response = reader.ReadLine();
stream.Close();
}
信息确实到达了我的TCP服务器。 (通过使用tcp查看器确认)。但是由于我不知道如何包含标头,因此服务器无法响应我,因为它正在考虑我的请求未完成。在此先感谢大家的帮助。
答案 0 :(得分:0)
标头不仅是消息的前缀?他们没有提供例子吗?试试这个(假设消息少于65535字节):
var totalMessageLength = message.Length + 2;
var quotient = (int)totalMessageLength / 256;
var modulo = totalMessageLength % 256;
message = $"{quotient.ToString("X2")}{modulo.ToString("X2")}{message}";