C#套接字发送序列化数据

时间:2011-07-28 16:32:25

标签: c# sockets serialization tcp

我无法通过TCP / IP套接字连接发送序列化数据。

我的发送功能如下:

public void SendData(NetworkConnection connection, ReplicableObject ro) {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, ro);

            ms.WriteTo(connection.TcpStream);
            connection.TcpStream.Flush();

            ms.Close();
        }

我知道目前TcpStream.Flush()没有做任何事情。无论如何,这不是我的问题。

在接收(客户端)端,阅读器如下所示:

byte[] readBuffer = new byte[8192];
            worldMapStream = worldMapConnection.GetStream();
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            IsConnectedToWorldMap = true;
            while (true) {
                try {
                    do {
                        int bytes = worldMapStream.Read(readBuffer, 0, readBuffer.Length);
                        ms.Write(readBuffer, 0, bytes);
                    }
                    while (worldMapStream.DataAvailable);

                    try {
                        ReplicableObject ro = (ReplicableObject) bf.Deserialize(ms);
                        ro = ro;
                    }
                    catch (Exception e) {
                        e = e;
                    }
                }

奇怪的ro = ro和e = e就在那里,所以我可以添加一个断点。

我的问题是:读取总是失败。我得到一个异常捕获,并且消息说明在解析完成之前已到达流的末尾。现在,我明白数据可能并非全部到达一个块,但我没有清除捕获异常的内存流,所以下一个块应该只是将剩余的数据添加到它的末尾,对吧?但显然这不起作用。

那么,我做错了什么?提前致谢。 :)

P.S。我知道WCF是更好的选择;但不幸的是我不能在这个项目中使用它。

1 个答案:

答案 0 :(得分:2)

我们走了:

while (worldMapStream.DataAvailable);

应该是:

while(bytes>0);

这也意味着将bytes移到循环之外。

DataAvailable只是意味着“现在,在NIC”。它没有告诉你是否会有更多。另外,在bytes>0时你也应该;老实说,while循环在这里更容易:)

然后;在填充ms之后设置ms.Position = 0以倒带流。