О Java ServerSocket Accept: занято?

1

Я читаю TCP/IP Socket в Java, о serverocket, он говорит

Когда мы вызываем accept() в этом экземпляре ServerSocket, если новое соединение ожидает ответа, accept() возвращается немедленно; в противном случае он блокируется до тех пор, пока не произойдет соединение или не истечет таймер, в зависимости от того, что наступит раньше. Это позволяет одному потоку обрабатывать несколько соединений. К сожалению, этот подход требует, чтобы мы постоянно проводили опрос всех источников ввода-вывода, и этот подход "ожидание" снова вводит много накладных расходов на велосипед через соединения, чтобы узнать, что им нечего делать.

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

-----------------РЕДАКТИРОВАТЬ----------------------

Весь абзац выглядит следующим образом:

Из-за этих осложнений некоторые программисты предпочитают придерживаться однопоточного подхода, в котором сервер имеет только один поток, который имеет дело со всеми клиентами, а не последовательно, но все сразу. Такой сервер не может позволить себе блокировать операцию ввода-вывода с любым одним клиентом и использовать исключительно неблокирующий ввод-вывод. Напомним, что при неблокирующем вводе-выводе мы указываем максимальное время, в течение которого вызов метода ввода-вывода может блокироваться (включая ноль). Мы видели пример этого в главе 4, где мы устанавливаем таймаут в операции accept (с помощью метода setSoTimeout() ServerSocket). Когда мы вызываем accept() в этом экземпляре ServerSocket, если новое соединение ожидает ответа, accept() возвращается немедленно; в противном случае он блокируется до тех пор, пока не произойдет соединение или не истечет таймер, в зависимости от того, что наступит раньше. Это позволяет одному потоку обрабатывать несколько соединений. К сожалению, подход требует, чтобы мы постоянно проводили опрос всех источников ввода-вывода, и такой подход "ожидание" снова вводит много накладных расходов на велосипеде через соединения, чтобы выяснить, что им нечего делать

Теги:
serversocket

1 ответ

0

Это в основном бессмыслица, даже во всей цитате. Либо вы используете блокирующий ввод-вывод, и в этом случае вам нужен поток на соединение, а другой - за цикл accept(), или вы используете неблокирующий ввод-вывод, и в этом случае у вас есть select(), или из Java 7, вы используете асинхронный ввод-вывод, и в этом случае это все обратные вызовы в обработчики завершения. Ни в одном из этих случаев вам не нужен опрос или ожидание.

Я думаю, он должен ссылаться на режим блокировки с очень короткими таймаутами, но это действительно самое неясное.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню