Параллельная и упорядоченная загрузка чанков с 2 серверов — Android

Я работаю над приложением для Android, целью которого является загрузка фрагментов(частей видеофайла) с 2 серверов, добавление их по порядку(в основной видеофайл) после каждый из них загружается и, наконец, воспроизводит этот видеофайл, пока продолжается загрузка..

Это хорошо работает, когда загрузка выполняется последовательно с использованием двух разных потоков (по одному для каждого сервера), которые выполняют загрузку. Я хочу знать, как можно добиться вышеуказанного, но с одновременной загрузкой вместо последовательной.

То есть загружать чанки с серверов одновременно и по порядку. Например, за тот же период времени загрузите чанк0, чанк1 и чанк2 с сервера 1 (который, скажем, в 3 раза быстрее, чем сервер 2) и чанк3 с сервера 2, так что мы полностью используем всю доступную пропускную способность 2 сервера в этот период времени. И этот процесс повторяется до тех пор, пока не будут загружены все фрагменты.

Как я уже сказал выше, при использовании потоков и соединений загрузка выполняется последовательно. Чтобы сделать его параллельным, я попытался удалить объединение из каждого потока, но тогда он не загружает куски по порядку, а также загружает только с одного сервера, а не с обоих. AsyncTask не является решением, поскольку он также не загружает фрагменты по порядку.

Итак, есть ли способ добиться этой одновременной и по порядку загрузки фрагментов, как я описал выше? Кто-нибудь делал что-то подобное в качестве проекта, чтобы точно знать ответ?


person sami    schedule 14.05.2013    source источник


Ответы (1)


Вы можете использовать популярный метод среди ускорителей загрузки.

В общем, идея заключается в том, чтобы запрашивать куски с каждого сервера, используя HTTP-заголовок Range. (Сервер отвечает на заголовок Accept-Ranges, когда он способен соответствующим образом обработать заголовок Range). (В этом блоге есть хорошее объяснение этому).

Каждый поток/выполняемый/вызываемый должен знать, за какой фрагмент он отвечает (позиция первого байта + длина?), потому что каждый должен будет написать свою часть в файле.

Затем будет принято решение, вы можете:

  1. Запишите файл, используя экземпляр RandomAccessFile в каждом потоке. , очевидно, размещая указатель файла в первой позиции байта его фрагмента (с метод поиска) или..

  2. Убедитесь, что у вас есть уникальный рабочий поток (см. Исполнители и submit), который отвечает за запись байтов, передаваемых каждым потоком. Поскольку в момент записи вы будете использовать поиск для перемещения указателя файла в правильное положение, ошибок перекрытия не будет.

ПРИМЕЧАНИЕ. Если вы хотите иметь возможность начать воспроизведение, когда у вас есть первый фрагмент, вы можете сделать это, выполнив этот код после завершения загрузки и записи первого потока фрагмента.

person DNax    schedule 24.07.2013