2013-08-24 83 views
1

我正在C#中创建下载管理器。我目前正在设计给定URL的下载组件,从网段中下载文件。我目前使用我

/O流的每个组块,如下所示:在C#中使用下载管理器下载文件

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)/视频文件 您是否可以建议使用相同的方法?

回答

1

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

但是通过下载文件块,有一个共同的观点,即文件被拆分成多个部分,然后这些部分被单独下载。

要实现这个功能,您必须使用HTTP Range标头(请参阅this question进行讨论),它允许您只下载一大块数据并使用多个客户端。

下载不会加快,即使你使用多个线程在同一时间,因为你bandwidth是限制下载速度,下载块。相反,您必须管理块偏移和冗余连接。

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

现在问题的第二部分:虽然它在某些情况下可能在播放过程中以块的形式下载文件,但这种方法在连接速度较慢时会失败。你有没有考虑过寻找streaming solution

最后,this question指向NAudio,它甚至带有Mp3StreamingDemo,允许播放流式传输的mp3音频文件。