这是风景..。
服务器
TcpListener服务器TcpClient.GetStream()包装在一个缓冲流中。BinaryFormatter反序列化来自流的传入数据。客户端
TcpClient.GetStream()封装在一个缓冲流中。BinaryFormatter来序列化流上的数据。只要连接保持活动状态,所有工作井都可以工作。我测试了好几个小时。
问题
TcpClient和新的BufferedStream。BinaryFormatter重新开始序列化数据。但是,现在服务器将得到各种奇怪的反序列化异常。我已经看过流的字节,而令我惊讶的是,流正在被破坏!但只有在重新连接风景之后。并且,摆脱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,一切正常。同样,当重新连接上述客户端过程时,重复进行。
发布于 2014-05-29 23:18:42
我已经解决了重新连接的问题,但没有牺牲太多的速度,首先写到MemoryStream,然后调用MemoryStream.WriteTo(流)将数据写入非缓冲的NetworkStream。这个解决方案可以工作,但仍然没有解释BufferedStream问题,而且不太适合发送大型对象,因为在发送任何东西之前,必须对整个对象进行序列化。
仍然不确定BufferedStream的问题是什么。而且,更让人困惑的是,我发现代码在一台机器上运行得完美无缺,而在另一台机器上却没有。可能是司机的问题?
但是,先序列化到一个MemoryStream,然后调用MemoryStream.WriteTo(Stream),对我来说已经足够好了,并且在所有经过测试的机器上运行都很好,所以我就这么做了。
https://stackoverflow.com/questions/23838519
复制相似问题