gpt4 book ai didi

c# - 为什么流不支持seek操作?

转载 作者:太空狗 更新时间:2023-10-29 21:22:27 24 4
gpt4 key购买 nike

我目前正在使用 tcp/ip 套件。我正在编写一个程序来在发送方加密文件并在接收方解密。我在用网络流的长度初始化我的字节数组时遇到了这个异常。这是我的代码:

if (client.Connected)
{
NetworkStream binarystream = client.GetStream();
byte[] receivebytes = new byte[binarystream.Length];
binarystream.Read(receivebytes, 0, receivebytes.Length);
Stream file = File.OpenWrite(saveFileDialog1.FileName);
file.Write(receivebytes, 0, receivebytes.Length);
file.Close();
binarystream.Close();
}

控制层次确保 client.GetStream() 返回的流在构成二进制流实例之前已经被使用。我得到的异常是在包含以下内容的行中:

byte[] receivebytes = new byte[binarystream.Length];

表示流不支持seek操作。这是什么意思?

最佳答案

这是 Stream 的正常状态。您需要在脑海中将其建模为 Spring 的沙漠小河,像溪流一样滴流的水是滴流的字节。你不知道它什么时候会干涸,这需要天气预报忠实地预测何时会停止下雨。

这样的天气预报肯定存在。如果它实际上是一个 MemoryStream 就没有问题,它可以访问所有 字节,因此它可以可靠地告诉您它何时耗尽。或者一个 FileStream,现在操作系统的文件系统可以提供预测。文件数据的目录项记录了文件的长度。

TCP 流变得更加困难。 TCP 协议(protocol)本身根本不提供信息。您只能继续调用套接字的 Read() 方法,当它返回 0 时,您就知道雨停了。

这通常需要在 TCP 之上构建协议(protocol)。非常常见的 HTTP 协议(protocol)就是一个很好的例子。它确实为您提供了预测,它是HttpWebRequest.ContentLength .或者你自己制作,标准技术是让发送器首先写入 4 个字节,说明后面有多少数据。但是 NetworkStream 并不迎合特定的协议(protocol)实现,它模拟了一个通用的网络流。您必须自己添加天气预报。

关于c# - 为什么流不支持seek操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23321619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com