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