我正在使用C#创建下载管理器。我目前正在设计给定URL的下载组件,从URL中分段下载文件。
我目前正在为每个块使用I / O流,如图所示下面:
MyChunks.InputStream = rs ;
//rs is obtained by using GetResponse() from FtpWebRequest or HttpWebRequest
MyChunks.OutputStream = fs ; //fs is FileStream for writing on local file
chunksize = MyChunks.InputStream.Read(buffer, 0, bufferSize);
MyChunks.OutputStream.Write(buffer, 0, (int)chunksize);
关于我分析的其他方法,我发现我也可以使用`WebClient.DownloadDataAsync`方法。
但是,我无法利用在多个线程上下载的数据块来加速下载。此外,上面的代码工作正常。
我的问题是:
是否有其他方法可供下载或更高版块 代码很好吗?
另外,我想在下载时播放音频(mp3)/视频文件 你能建议做同样的方法吗?
答案 0 :(得分:1)
使用发布的代码,您只下载文件的一部分,这是正确的。根据缓冲区的大小,整个下载不太可能适合缓冲区。因此,您必须重复上面的代码片段,直到到达流的末尾。这就是从缓冲流中读取数据的方式。
但通过以块的形式下载文件,有一个共同的概念,即文件分为多个部分,然后单独下载这些部分。
要实现您必须使用HTTP Range
标头(请参阅this question进行讨论),这样您只能下载一大块数据并使用多个客户端。
但即使您使用多个线程同时下载块,下载也不会加速,因为您的bandwidth 正在限制下载速度。相反,您必须管理块偏移和冗余连接。
上述方法DownloadDataAsync
用于以非阻塞方式下载数据,您可以查看this question进行讨论。
现在问题的第二部分:虽然在某些情况下它可能适用于在播放期间以块的形式下载文件,但这种方法在较慢的连接上会失败。您考虑过寻找streaming solution吗?
最后,this question指向NAudio,其中包含Mp3StreamingDemo,可以播放流式mp3音频文件。