继承人的场景......
服务器
TcpListener
服务器正在接受连接TcpClient.GetStream()
包装在缓冲流中。BinaryFormatter
反序列化流中的传入数据客户端
TcpClient.GetStream()
包装在缓冲流中。BinaryFormatter
来序列化Stream上的数据。只要连接保持活动状态,所有工作都会正常工作。我已经测试了几个小时。
问题
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一切正常。当重新连接上述客户端进程时也是如此。
答案 0 :(得分:0)
我通过首先写入MemoryStream然后调用MemoryStream.WriteTo(Stream)将数据写入非缓冲的NetworkStream来解决重新连接问题而不牺牲太多速度。这个解决方案有效,但仍然没有解释BufferedStream问题,并且不太适合发送大型对象,因为在发送任何内容之前必须序列化整个对象。
仍然不确定BufferedStream是什么问题。而且,为了让它更加混乱,我发现代码在一台机器上完美无缺,但在另一台机器上却没有。可能是驱动程序问题?
但是,首先序列化到MemoryStream然后调用MemoryStream.WriteTo(Stream)对我来说运行得很好,并且在所有测试过的机器上都运行良好,所以我选择了。