我正在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"方法
但是,我无法利用在多个线程上下载的数据块来加快下载速度。此外,上面的代码运行良好。
我的问题是:
有没有其他方法可以下载chunk或更高版本代码刚刚好吗
此外,我想在下载音频(mp3)/视频文件时播放它们你能提出同样的方法吗?
对于发布的代码,您只下载了文件的一部分,这是正确的。根据缓冲区的大小,整个下载不太可能放在缓冲区中。因此,您必须重复上面的代码片段,直到到达流的末尾。这就是从缓冲流中读取的工作原理。
但是通过分块下载文件,有一种常见的概念是将文件拆分为多个部分,然后分别下载这些部分。
要实现这一点,您必须使用HTTPRange
标头(有关讨论,请参阅此问题),该标头允许您仅下载一大块数据并使用多个客户端。
但是即使您使用多个线程同时下载区块,下载也不会加快,因为您的带宽限制了下载速度。相反,您将不得不管理块偏移和冗余连接。
上述方法DownloadDataAsync
用于以非阻塞方式下载数据,您可以查看此问题进行讨论。
现在来看你问题的第二部分:虽然在某些情况下,在播放过程中分块下载文件可能会奏效,但这种方法在连接速度较慢的情况下会失败。您是否考虑过寻找流媒体解决方案?
最后,这个问题指向NAudio,它甚至附带了一个Mp3StreamingDemo,可以播放流式mp3音频文件。