2012-06-14 3 views
0

Я новичок в Java NIO.Подход к созданию UDP-сервера?

У меня есть Java-программа, которая запрашивает серверы (разные IP-адреса/порты) итеративно в цикле. Но теперь я хочу отправить все пакеты одновременно, а не в цикле, а затем сохранить данные, полученные в ответном пакете.

Запрос состоит только из 1 пакета ответа, дальнейшая связь не требуется.

это способ сделать это -> Сделать дейтаграмма канала, посылать все пакеты через .send(), прослушивания пакетов и начать новый поток для обработки и хранения пакетных данных.

Количество серверов может быть> 400. Лучше сделать 400 потоков или 400 каналов датаграмм ??? Также следует использовать пакет async вместо NIO.

Было бы проще с Netty и т. Д.?

+0

Я бы начал работать с NIO. Стоит отметить, что, хотя TCP надежный, UDP нет. Вы должны учитывать тот факт, что некоторые пакеты могут не прибыть. Для 400 TCP-соединений я бы все равно использовал один поток, если только не было повода для этого. Серверы –

+0

отвечают только на UDP. Потерянные пакеты не являются проблемой. – User1234

ответ

0

Я недостаточно осведомлен, чтобы советовать NIO, но в отношении обработки ответов - лучше использовать пул потоков и пул каналов.

EDIT - больше объяснений

Вы должны иметь только один поток, который прослушивает порт, к которому серверы ответить. Получив ответ, отправьте «задачу обработки» в очередь задач. Следующий доступный поток вытащит эту задачу и обработает ее.

Итак, если у вас есть больше ответов (= задач), чем доступных потоков, задачи будут ждать в очереди. Java имеет хорошую поддержку пула потоков под пакетом java.util.concurrent. Эти ограничения, конечно, могут быть сконфигурированы.

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

+0

если я создаю пул потоков с 50 потоками и получим ответные пакеты 51. Что произойдет с дополнительным пакетом? – User1234

+0

@Solution Почему у вас есть 50 потоков, когда один поток может принимать 51 пакет? –

+0

, если пакет получен, когда один поток все еще обрабатывает предыдущий пакет, что произойдет? – User1234

0

Если вы собираетесь использовать UDP, вы можете использовать один поток на сервер и один порт для всех них. Вы можете использовать пару портов для разных типов сообщений.

Если вы используете только один порт с несколькими литыми &, любой слушатель будет слышать все пакеты из любого приложения на этот IP-адрес &.

+0

есть ли существующая библиотека/открытый исходный код, который обрабатывает несколько параллельных пакетов в java. Любой пример кода также будет делать. Спасибо. – User1234

+0

Сколько сетевых адаптеров вы перечисляете? Если у вас есть подключение 1 ГБ, а ваши пакеты имеют размер 1 КБ, они не будут находиться ближе, чем на 10 микросекунд. Если вы отправляете около 100 К/с, они будут отправляться в почти случайные моменты. –

+0

Как долго работает метод .receive() в канале дейтаграмм? Для примера. если я отправлю пакет с .send() и поставлю точку останова ... дождитесь некоторого времени ... могу ли я по-прежнему использовать .receive() успешно. Спасибо. – User1234

Смежные вопросы