Какой смысл использовать UDP с NIO?

NIO и TCP составляют отличную пару для многих соединений. Поскольку для каждого нового клиента необходимо открыть новое соединение, каждому из этих клиентов обычно требуется собственный поток для блокировки операций ввода-вывода. NIO решает эту проблему, позволяя считывать данные, когда это возможно, а не блокируя, пока он не будет доступен. Но как насчет UDP?

Я имею в виду, что без подключения UDP не имеет блокирующего характера TCP, связанного с ним из-за того, как разработан протокол (отправить это и забыть, в основном). Если я решу отправить некоторые данные на какой-то адрес, то он сделает это без задержек (на сервере). Аналогично, если я хочу читать данные, я могу просто получать отдельные пакеты из разных источников. Мне не нужно иметь много соединений со многими местами, используя много потоков для работы с каждым из них.

Итак, как NIO и селекторы улучшают UDP? Более конкретно, когда предпочтительнее использовать UDP с NIO, а не ol' ?

2 ответов


и DatagramSocket.receive(...) способ описан как блокировка операции. Например, если у вас есть один поток, который пытается обрабатывать пакеты из N разных сокетов, вам нужно будет использовать NIO и селекторы. Аналогично, если поток должен был мультиплексировать проверку новых пакетов с другими действиями, вы могли бы сделать это.

если у вас нет этих или подобных требований, то селекторы не поможет. Но это не отличается от случая TCP. Вы не должны использовать селекторы с TCP, если они вам не нужны, потому что это потенциально добавляет дополнительный системный вызов.

(в Linux, в случае дейтаграммы, вы бы сделали select syscall с последующим recv ... вместо просто recv.)


но если вы имеете дело только с одним DatagramSocket, разве метод receive не считывает пакеты сразу же по мере их поступления, независимо от того, что они с другого компьютера?

если вы слушаете один сокет для датаграмм от "everyone", то да. Если у вас разные сокеты для разных компьютеров, то нет.

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

мы не обсуждали это дело. Но да, это правда. И то же самое верно, если у вас есть тысячи потоков, блокирующих на UDP получает.

моя точка зрения заключалась в том, что это ты не есть много потоков, или если это не имеет значения если поток блокирует, то NIO не помогает. Фактически, это может снизить производительность.


NIO полностью устраняет необходимость в потоках. Он позволяет обрабатывать все ваши клиенты в одном потоке, включая TCP и UDP клиентов.

connectionless UDP не имеет блокирующего характера TCP, связанного с ним

Это неправда. Получает еще и может отправляет, по крайней мере в теории.