2

这让我现在很生气,我目前正在编写一些客户端/服务器软件,我可以毫无问题地在客户端之间发送数组,但问题在于这里的代码:

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 当前来避免出现实际的网络硬件错误)。

这是使用 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()));
4

1 回答 1

1

在玩了很多之后,我最终解决了这个问题,只需使用以下方法将缓冲区写入自身:

fs.Write(fs.GetBuffer(), 0, fs.Capacity);

我觉得一定有编译器错误或发生了什么,但这说服了它的行为。现在我将讨论现在出现的另一个问题。

废了很多,结果上面的行没有任何帮助,真正的错误是我正在执行异步写入并且几乎立即正在写入网络的缓冲区被破坏,这基本上意味着 1 或 2 个字节通过然后加载0。因此,对于将来遇到此问题的任何人,请确保您没有做像我这样愚蠢的事情。

感谢你们中的一些人为了弄清楚发生了什么而进行的询问。

于 2013-05-07T17:17:32.140 回答