这里的风景...
服务器
- 我有
TcpListener
接受连接的服务器 - 建立连接后,我将其包装
TcpClient.GetStream()
在缓冲流中。 - 然后我使用 a
BinaryFormatter
反序列化来自流的传入数据
客户
- 我连接到服务器
- 连接后,我将其包装
TcpClient.GetStream()
在缓冲流中。 - 然后我使用 a
BinaryFormatter
通过 Stream 序列化数据。
只要连接保持活动状态,一切都会运行良好。我已经测试了几个小时。
问题
- 然后我停止服务器以模拟网络故障(我正在使用 localhost)
- 客户端将检测故障(抛出/处理的异常)
- 客户端稍后将重新连接一个新的
TcpClient
和新的BufferedStream
- 客户端将使用 new
BinaryFormatter
再次开始序列化数据。
然而现在,服务器会得到各种奇怪的反序列化异常。我已经低至查看 Stream 的字节,令我惊讶的是发现流已损坏!...但只有在重新连接场景之后。并且,摆脱BufferedStream
和使用NetworkStream
直接解决了这个问题。您可以多次重新连接而不会看到此问题。
是怎么回事BufferedStream
?每次重新连接我都会创建一个新的BufferedStream
,但是以前的流会以某种方式影响新的流吗?
有没有人见过这样的事情?
不幸的是我不能发布整个代码,但这是我正在做的一个例子......
示例服务器代码
while (true)
{//Accept connections and spawn threads to handle incoming connections
TcpClient connection = server.AcceptTcpClient();
}
//Done on another thread
Stream stream = new BufferedStream(connection.GetStream());
BinaryFormatter formatter = new BinaryFormatter();
object data = formatter.Deserialize(stream);
示例客户端代码
_connection = new TcpClient();
_connection.Connect(_remoteAddress);
NetworkStream netStream = _connection.GetStream();
Stream stream = new BufferedStream(netStream);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, data);
stream.Flush();
不使用 BufferedStream 一切正常。此外,在重新连接上述客户端过程时也会重复。