0

这里的风景...

服务器

  • 我有TcpListener接受连接的服务器
  • 建立连接后,我将其包装TcpClient.GetStream()在缓冲流中。
  • 然后我使用 aBinaryFormatter反序列化来自流的传入数据

客户

  • 我连接到服务器
  • 连接后,我将其包装TcpClient.GetStream()在缓冲流中。
  • 然后我使用 aBinaryFormatter通过 Stream 序列化数据。

只要连接保持活动状态,一切都会运行良好。我已经测试了几个小时。

问题

  • 然后我停止服务器以模拟网络故障(我正在使用 localhost)
  • 客户端将检测故障(抛出/处理的异常)
  • 客户端稍后将重新连接一个新的TcpClient和新的BufferedStream
  • 客户端将使用 newBinaryFormatter再次开始序列化数据。

然而现在,服务器会得到各种奇怪的反序列化异常。我已经低至查看 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 一切正常。此外,在重新连接上述客户端过程时也会重复。

4

1 回答 1

0

我已经通过先写入 MemoryStream 然后调用 MemoryStream.WriteTo(Stream) 将数据写入非缓冲 NetworkStream 来解决重新连接问题而不会牺牲太多速度。此解决方案有效,但仍无法解释 BufferedStream 问题,并且对于发送大型对象不太理想,因为在发送任何内容之前必须对整个对象进行序列化。

仍然不确定 BufferedStream 问题是什么。而且,为了让它更加混乱,我发现代码在一台机器上完美运行,但在另一台机器上却不行。可能是驱动问题?

但是,首先序列化到 MemoryStream 然后调用 MemoryStream.WriteTo(Stream) 对我来说效果很好,并且在所有经过测试的机器上运行良好,所以我就这么做了。

于 2014-05-29T23:18:42.040 回答