重新连接丢弃的NetworkStream时损坏的BufferedStream

时间:2014-05-23 21:24:05

标签: c# serialization tcpclient networkstream bufferedstream

继承人的场景......

服务器

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

客户端

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

只要连接保持活动状态,所有工作都会正常工作。我已经测试了几个小时。

问题

  • 然后我停止服务器模拟网络故障(我正在使用localhost)
  • 客户端将检测到错误(抛出/处理异常)
  • 客户端稍后会使用新的TcpClient和新的BufferedStream
  • 重新连接
  • 客户端将使用新的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一切正常。当重新连接上述客户端进程时也是如此。

1 个答案:

答案 0 :(得分:0)

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

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

但是,首先序列化到MemoryStream然后调用MemoryStream.WriteTo(Stream)对我来说运行得很好,并且在所有测试过的机器上都运行良好,所以我选择了。