并发和顺序下载块从2个服务器- Android



我正在开发一个Android应用程序,其目的是从2个服务器下载块(视频文件的一部分),在每个服务器下载后按顺序(进入主视频文件)附加它们,最后播放此视频文件,同时继续下载。

当使用两个执行下载的不同线程(每个服务器一个)串行完成下载时,这工作得很好。我想知道它是如何可能实现上述,但与并发下载,而不是串行。

即同时按顺序从服务器下载数据块。例如,在同一时间段下载chunk0, chunk1 &来自server1的Chunk2(假设比server2快3倍)和来自server2的chunk3,这样我们就完全使用了这段时间内两台服务器的所有可用带宽。这个过程会一直重复,直到下载完所有的数据块。

通过使用线程和join,下载是串行的,如上所述。为了使它并发,我试图从每个线程中删除连接,但它不会按顺序下载块,也只从一个服务器下载,而不是从两个服务器。AsyncTask不是一个解决方案,因为它也不按顺序下载块。

那么,有没有一种方法可以实现并发的,按照我上面描述的顺序下载数据块呢?有没有人做过这样的项目,以便确切地知道答案?

您可以使用在下载加速器中流行的技术。

一般来说,这个想法是关于使用Range HTTP头从每个服务器请求块。(当服务器能够处理相应的范围报头时,服务器响应Accept-Ranges报头)。(这个博客对此有很好的解释)。

每个线程/可运行/可调用必须知道哪个块是它的责任(第一个字节位置+长度?),因为每个线程都必须在文件中写入自己的部分。

然后会有一个决定要做,你可以:

  1. 在每个线程中使用RandomAccessFile的实例写文件,显然将文件指针定位在其块的第一个字节位置(使用seek方法),或者…

  2. 确保您有一个唯一的工作线程(请参阅executor和submit),负责编写每个线程告诉的字节。在写入时,您将使用seek将文件指针移动到正确的位置,不会出现重叠错误。

注意:如果你想在你有第一个数据块时开始播放,你可以在第一个数据块线程下载+写入完成后执行该代码。

最新更新