Java NIO против потока для подключения к Bittorrent-трекеру - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь закодировать клиент BitTorrent в Java только для практики. Для соединений с трекером я использую URL-адреса в поле announce-list торрент-файла. Чтобы реально общаться с трекерами, я использовал java nio (DatagramChannel и селекторы), а не потоки, и он работает. Однако, согласно спецификациям торрента, запросы повторяются каждые 15 * 2^n секунды, если соответствующие ответы не получены. Когда я искал решения для этого через NIO, я не смог найти ни одного. Однако я нашел много ссылок на классы Timer и TimerTask. Итак, мой вопрос: я должен использовать NIO или TimerTask для планирования отправки запросов трекера? Если ответ NIO, как добиться повторной передачи, используя NIO?

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Блокирование (поток на соединение) против неблокирования (селекторы + каналы в неблокирующем режиме) и планирование задач являются ортогональными.

Режим блокировки ввода-вывода заключается в том, как ваши потоки взаимодействуют с сокетами один разони были настроены относительно пропускной способности, задержки, параллелизма, а также сложности кода.Блокировка ввода-вывода относительно проста и может легко обеспечить высокую пропускную способность.Неблокирующий ввод-вывод (по крайней мере, java.nio без поддержки аннотаций, которые его упрощают) может быть довольно сложным, но может обрабатывать больше соединений параллельно, не разрушая счетчик потоков вашего процесса.

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

Поскольку вы, вероятно, толькодля обработки нескольких HTTP-подключений одновременно блокируется ввод-вывод, то есть простого HTTP-клиента, такого как HttpURLConnection, может быть вполне достаточно.Но если вы используете Java 11 или более позднюю версию, вы также можете использовать java.net.http.HttpClient API, который использует NIO под капотом, справляясь с большей частью сложности для вас.В любом случае отсрочка следующего объявления может быть сделана либо через Timer, либо через ScheduledExecutorService.

0 голосов
/ 03 мая 2019

возможно использовать ScheduledExecutorService для запуска отложенных задач и выполнения действий с использованием NIO?Это имеет некоторые преимущества перед TimerTask.Вы можете продолжать использовать NIO, чтобы не блокировать часть сетевого ввода-вывода вашего приложения.

...