我在通过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 行只是为了我可以添加断点。
我的问题是:读取总是失败。我遇到了一个异常,消息解释说在完成解析之前已经到达了流的末尾。现在,我知道数据可能不会一次性全部到达,但我没有在捕获异常时清除内存流,所以下一个块应该只是将剩余的数据添加到其末尾,对吧?但这似乎行不通。
那么,我做错了什么?提前致谢。
附言:我知道 WCF 是更好的选择;但不幸的是,在这个项目中我不能使用它。