Как реализовать таймауты для нескольких запросов на объявление BitTorrent? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь сделать клиент BitTorrent только для учебных целей.Сначала я объясню, что я делал до сих пор.

Я создал пул потоков, размер которого равен числу доступных процессоров.Теперь каждый торрент-файл выполняется в отдельном потоке.Я получаю список URL трекеров из каждого торрент-файла и использую Java NIO для отправки запросов на подключение.Я предполагаю, что отправляю все запросы на подключение примерно в одно и то же время, потому что я просто зацикливаю список URL-адресов и отправляю запросы.Поэтому вместо того, чтобы поддерживать таймауты для каждого URL, я запускаю таймер при отправке первого запроса.Когда таймер истекает, я повторно отправляю запрос на подключение ко всем URL, которые не ответили.(Здесь для таймера я вычисляю interval и отслеживаю время запуска startTime. Я зацикливаюсь, пока currentTimeMillis() не превысит startTime+interval. Внутри цикла я использую selector.select(), чтобы выбрать channels, которые готовы. Когдацикл завершается, я повторно отправляю запрос на подключение всем каналам, которые не ответили. Я не использовал Timer и ScheduledExecutorService, потому что я думал, что это может привести к взрыву числа потоков. Я уже использую один поток на файл. ИсправитьМне по этому поводу и предложат лучшие подходы).

Основная проблема возникает при отправке анонсирующих запросов.Я могу получить ответ о соединении в любой момент времени, и в этот момент я должен отправить запрос на объявление, запустить таймер и повторно отправить запрос, если он истек.В настоящее время для каждого ответа на соединение я отправляю задачу Runnable в пул потоков, который обрабатывает отправку запроса на объявление.Поэтому я использую один поток для каждого цикла запрос-ответ.Так что, если у меня много торрент-файлов и каждый файл имеет как минимум 5 URL-адресов трекера, не вызовет ли это проблемы с производительностью?Какой лучший способ заставить эту вещь работать?Было бы очень полезно, если бы кто-то смог пролить свет на то, как торрент-клиенты обрабатывают столько файлов и столько циклов ответа на запрос одновременно.

1 Ответ

0 голосов
/ 08 июля 2019

Основным преимуществом использования nio или библиотеки на основе селектора, такой как netty, является возможность мультиплексировать несколько сетевых соединений в один объект и ожидать только этого объекта.Под мультиплексом определенно понимается , состоящий из нескольких чередующихся частей .И в этом случае вы объединяете несколько сетевых подключений, для которых раньше требовалось ожидание отдельных потоков, в один концептуальный объект ( Selector ), для которого требуется только один поток ожидания.В вашем случае вы могли бы объединить все ваши сетевые соединения в один селектор и ждать этого в одном потоке.Таким образом, не было бы распространения потоков.Таким образом, для перестройки вашей системы может потребоваться дополнительная бухгалтерия для каждого соединения, которое ранее было бы локальным для потока, которому была поручена обработка этого соединения.

Кроме того, не используйте System # currentTimeMillis для расчета разницы во времени, вместо этого используйте System # nanoTime, поскольку на это не будут влиять какие-либо изменения времени системы.

...