【问题标题】:Concurrent and In Order Downloading chunks from 2 servers - Android从 2 个服务器并发和按顺序下载块 - Android
【发布时间】:2013-05-14 20:11:15
【问题描述】:

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

当下载通过使用执行下载的两个不同线程(每个服务器一个)串行完成时,这很有效。我想知道如何通过并发下载而不是串行下载来实现上述目标。

即同时按顺序从服务器下载块。例如,同一时间从server1下载chunk0、chunk1和chunk2(比方说比server2快3倍)和从server2下载chunk3,这样我们就完全使用了所有可用带宽这段时间的2台服务器。这个过程会一直重复,直到所有的块都下载完毕。

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

那么,有什么方法可以实现我上面描述的并发顺序下载块?有没有人做过这样的项目,以便确定答案?

【问题讨论】:

    标签: java android concurrency chunks


    【解决方案1】:

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

    一般来说,这个想法是关于使用 Range HTTP 标头从每个服务器请求块。 (当服务器能够相应地处理 Range 标头时,它会响应 Accept-Ranges 标头)。 (This blog has a good explanation about that)。

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

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

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

      李>
    2. 确保您有一个唯一的工作线程(请参阅Executorssubmit)负责写入每个线程告知的字节。和写的时候一样,你会用 seek 把文件指针移动到正确的位置,不会有重叠的错误。

    注意:如果您希望在拥有第一个块时能够开始播放,您可以通过在第一个块线程下载+写入完成后执行该代码来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2018-05-26
      • 2016-02-22
      • 1970-01-01
      • 2017-10-18
      • 2015-09-10
      相关资源
      最近更新 更多