服务器端代码:
byte[] size = new byte[4];
size = BitConverter.GetBytes(fileData.Length);
stream.Write(size, 0, 4);
客户端代码:
byte[] size = new byte[4];
ReadWholeArray(s, size);
int fileSize = BitConverter.ToInt32(size, 0);
ReadWholeArray
方法的定义:
public static void ReadWholeArray(Stream stream, byte[] data)
{
int offset = 0;
int remaining = data.Length;
while (remaining > 0)
{
int read = stream.Read(data, offset, remaining);
if (read <= 0)
throw new EndOfStreamException
(String.Format("End of stream reached with {0} bytes left to read", remaining));
remaining -= read;
offset += read;
}
}
程序从服务器发送fileData.Length(此实例的值为2422)。在客户端接收到该数据时,接收数据的值为-772097985 为什么在没有改变价值的情况下没有收到发送的数据?有什么问题?
答案 0 :(得分:2)
好的,开始的简单诊断:在两端记录字节数组的各个内容,这样你就可以看到那里发生了什么。
通过这种方式,您可以查看通信协议中是否存在损坏的二进制数据,或BitConverter
是否导致您的问题。例如,您可以在一端使用big-endian BitConverter
,在另一端使用little-endian BitConverter
。这似乎不太可能,但它是可能的 - 特别是如果你的服务器或客户端之一运行Mono而不是.NET本身。
如果确实成为问题,您可能希望使用MiscUtil中的EndianBitConverter
类,它可以指定字节顺序。
如果问题出在通信层,您可能希望安装Wireshark以查看网络级别发生的情况。例如,你确定你已经阅读了你想要阅读的所有数据吗? (如果在此之前只读取了15个字节,并且大小写在偏移量16处,那么显然你将首先获得“额外”字节。)
答案 1 :(得分:0)
这很好用:
private void button2_Click(object sender, RoutedEventArgs e)
{
MemoryStream ms = new MemoryStream();
byte [] original = BitConverter.GetBytes((int)2224); // 176, 8, 0, 0
ms.Write(original, 0, original.Length);
ms.Seek(0, SeekOrigin.Begin);
byte [] data = new byte[4];
int count = ms.Read(data, 0, 4); // count is 4, data is 176, 8, 0, 0
int fileSize = BitConverter.ToInt32(data, 0); // is 2224
return;
}
你可以使用WireShark或其他东西截取字节吗?你使用什么样的连接?是否可以发送更多数据(即流开头的telnet控制字符)?你可以调试每一端并验证这些值或将字节数组内容写入日志文件吗?顺便说一句:“byte [] size = new byte [4];”是浪费,因为BitConverter.GetBytes()返回一个新数组。