我无法通过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是更好的选择;但不幸的是我不能在这个项目中使用它。
答案 0 :(得分:2)
我们走了:
while (worldMapStream.DataAvailable);
应该是:
while(bytes>0);
这也意味着将bytes
移到循环之外。
DataAvailable
只是意味着“现在,在NIC”。它没有告诉你是否会有更多。另外,在bytes>0
时你也应该写;老实说,while
循环在这里更容易:)
然后;在填充ms
之后设置ms.Position = 0以倒带流。