когда я использую nio, serverSocket.accept () выбрасывает IllegalBlockingModeException - PullRequest
1 голос
/ 30 ноября 2008

Когда я кодирую так:

ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress sa = new InetSocketAddress("localhost",8888);
ssc.socket().bind(sa);
ssc.configureBlocking(false);
ssc.socket().accept();

метод ServerSocket.accept() создает java.nio.channels.IllegalBlockingModeException. Почему я не могу позвонить accept(), хотя я установил блокировку на false?

Ответы [ 3 ]

2 голосов
/ 10 января 2009

В Javadoc конкретно указано, что ServerSocketChannel.accept():

Принимает подключение к разъему этого канала.

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

Общая идея:

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

Режим блокировки является стандартным по причине: большинство серверов не хотят опрашивать свой принимающий сокет для входящих соединений.

1 голос
/ 13 февраля 2009

Проблема в том, что вы звоните ssc.socket().accept(), а не ssc.accept(). Если вы измените последнюю строку на ssc.accept(), тогда она будет работать как положено, то есть будет возвращать SocketChannel, если он ожидает, или ноль, если нет.

1 голос
/ 30 ноября 2008

Потому что так говорит javadoc для serversocket.accept ()?

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

...