这让我很生气,我正在编写一些客户端/服务器软件,我可以在客户端之间发送数组而没有问题,但问题在于此代码:
MemoryStream fs = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
lock (fs)
lock (sharedVars.clients[i])
formatter.Serialize(fs, sharedVars.clients[i]);
sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray()));
我运行代码并使用断点我可以看到内存流包含来自序列化的数据,但是它永远不会进入另一台计算机(这实际上都是通过localhost来避免出现实际的网络硬件错误)。 / p>
这是使用TCP而真正疯狂的部分是,如果我手动将新的字节数组写入内存流,数据会毫无问题地到达另一方,实质上它只是不喜欢序列化数据。现在这让我很困惑,所以我向社区提出问题,任何想法?
有关更多参考,这是当完全为空的数组(在开头的request_rtn字节处)到达另一端时调用的内容:
Shared.SharedValues.Client clientTemp;
readBuffer = removeFirstByte(readBuffer);
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream(readBuffer);
ms.Position = 0;
lock (serverValues)
clientTemp = (Shared.SharedValues.Client)formatter.Deserialize(ms);
serverValues.clients[clientTemp.ID] = clientTemp;
然后在服务器端返回我更改的代码来测试它,它在各方面都有效:
MemoryStream fs = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
byte[] byteArray = new byte[10000];
for (i = 0; i < 10000; i++)
{
byteArray[i] = (byte)i;
}
lock (fs)
lock (sharedVars.clients[i])
//formatter.Serialize(fs, sharedVars.clients[i]);
fs.Write(byteArray, 0, 10000);
sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray()));
答案 0 :(得分:1)
经过多次玩弄后,我最终通过使用以下方法将缓冲区写入其自身来解决问题:
fs.Write(fs.GetBuffer(), 0, fs.Capacity);
我觉得必定存在编译器错误或者其他事情,但是这会让它说服它。现在我将讨论现在出现的其他问题。
废弃那么多,事实证明上面的行没有任何帮助,真正的错误是我正在进行异步写入,几乎立即被写入网络的缓冲区被破坏,这实质上意味着1或2个字节通过,然后加载0。所以对于今后遇到这个问题的人来说,确保你没有做像我这样愚蠢的事情。
感谢你们中的一些人试图找出正在发生的事情。