下面的代码遍历 aList<byte[]>()
但是问题是由于某种原因,有时 lengthBuffer 是 byteData 的不同大小。
您可以在 DebugPrintInGame 方法中看到,我打印了BitConverter.ToInt32()
length 和 actual byteDataList[i].Length
,这两个数字应该完全相同,而且很多时候它们是一样的,但是由于很多时候我不知道的原因,现在它们不是任何一个。
使用下面的代码,它将数据的长度发送到服务器,以便服务器知道传入数据的大小和预期的内容,然后发送实际数据。然而,有时它会发送比实际发送的数据更大的长度,但它是随机发生的,这让我相信这可能是一个线程问题——尽管如此 byteDataList 只在这个线程中使用,所以它甚至对我来说毫无意义锁定它。在我的测试中,我发送的数据不超过 2kb 到 17kb。
有没有人根据我的项目中的这个小片段看到为什么会发生这种情况?这段代码都是客户端。注意BitConverter.ToInt32(lengthBuffer, 0)
并且byteDataList[i].Length
预计会给出相同的长度,但事实并非如此。那就是问题所在。
List<byte[]> byteDataList = new List<byte[]>();
//.........
lock (byteDataList) //pointless lock, just used for random testing :\
{
if (byteDataList.Count > 0)
{
for (int i = 0; i < byteDataList.Count; i++)
{
try
{
byte[] lengthBuffer = BitConverter.GetBytes(byteDataList[i].Length);
//quick printout to compare lengths for testing
this.QueueOnMainThread(() =>
{
Tools.DebugPrintInGame("Length buffer " + lengthBuffer.Length +
+ BitConverter.ToInt32(lengthBuffer,0)+ " "+
+ byteDataList[i].Length); //this should be same as BitConverter lengthBuffer
});
//send length
stream.Write(lengthBuffer, 0, lengthBuffer.Length);
//send data
stream.Write(byteDataList[i], 0, byteDataList[i].Length);
stream.Flush();
}
catch (Exception ex)
{
this.QueueOnMainThread(() =>
{
Tools.DebugPrintInGame("Exception " + ex.ToString());
});
}
}
}
}
在发送到服务器之前从客户端打印出来:
当最后两个应该相同时,请注意不同的长度。IE
`lengthBuffer` = 17672
`byteDataList[i]` = 17672
但有时它会变得奇怪和不稳定:
`lengthBuffer` = 17672
`byteDataList[i]` = 2126
lengthBuffer 和 byteDataList[i] 都应该相同。