java - 并发和按顺序从 2 个服务器下载 block - Android

标签 java android concurrency chunks

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

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

也就是同时从服务器上按顺序下载chunk。例如,在同一时间段内从服务器 1 下载 chunk0、chunk1 和 chunk2(比起 server2 快 3 倍)并从 server2 下载 chunk3,这样我们就可以完全使用服务器的所有可用带宽这段时间的2台服务器。重复此过程,直到下载完所有 block 。

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

那么,有没有什么方法可以像我上面描述的那样实现这种并发按顺序下载 block ?有没有人作为一个项目做过这样的事情,以便确定答案?

最佳答案

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

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

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

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

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

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

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

关于java - 并发和按顺序从 2 个服务器下载 block - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16551987/

相关文章:

java - IRC 发送队列(Y 秒内 X 条消息)

java - 在 Java 中读取 HTTP 消息

Android Studio 1.1 preview 2 单机测试运行NullPointerException

java - 使用 Grails 查找现有的 ShiroRoles 添加到新的 ShiroUser 中?

java - 从 .txt 文件加载数据时出现 FileNotFoundException: "Access is denied"

android - 如何跨多个设备缩放用户提供的图像

android - APK 文件在磁​​盘上不存在

http - Scala海量网址下载

c - fork后如何通过键盘在子进程中引入字符串

java - 在 Java 中测试简单的信号量使用