1

我正在用 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` 方法。
但是,我不能利用在多个线程上下载的数据块来加快下载速度。此外,上面的代码工作正常。


我的问题是:

  1. 有没有其他方法可以下载块或上面的代码就可以了?

  2. 另外,我想在下载音频(mp3)/视频文件时播放它们,你能建议做同样的方法吗?

4

1 回答 1

2

使用发布的代码,您只下载文件的一部分,这是正确的。根据缓冲区的大小,整个下载不太可能适合缓冲区。因此,您必须从上面重复代码片段,直到到达流的末尾。这就是从缓冲流中读取的工作原理。

但是通过分块下载文件,通常认为文件被分成多个部分,然后这些部分被单独下载。

要实现这一点,您必须使用 HTTPRange标头(请参阅此问题进行讨论),它允许您仅下载一块数据并使用多个客户端。

但是即使您使用多个线程同时下载块,下载也不会加快速度,因为您的带宽限制了下载速度。相反,您必须管理块偏移和冗余连接。

上述方法DownloadDataAsync用于以非阻塞方式下载数据,您可以查看this question进行讨论。

现在到问题的第二部分:虽然在某些情况下可以在播放期间以块的形式下载文件,但这种方法在连接速度较慢时会失败。您是否考虑过寻找流媒体解决方案

最后,这个问题指向NAudio,它甚至带有一个Mp3StreamingDemo,允许播放流式 mp3 音频文件。

于 2016-08-08T20:23:36.997 回答