Когда я кодирую так:
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?
ServerSocket.accept()
java.nio.channels.IllegalBlockingModeException
accept()
false
В Javadoc конкретно указано, что ServerSocketChannel.accept():
ServerSocketChannel.accept()
Принимает подключение к разъему этого канала. Если этот канал находится в неблокирующем режиме, этот метод будет немедленно вернуть ноль, если нет ожидающих соединений. Иначе это заблокирует неопределенное время, пока не будет доступно новое соединение или не возникнет ошибка ввода-вывода.
Принимает подключение к разъему этого канала.
Если этот канал находится в неблокирующем режиме, этот метод будет немедленно вернуть ноль, если нет ожидающих соединений. Иначе это заблокирует неопределенное время, пока не будет доступно новое соединение или не возникнет ошибка ввода-вывода.
Общая идея:
Режим блокировки является стандартным по причине: большинство серверов не хотят опрашивать свой принимающий сокет для входящих соединений.
Проблема в том, что вы звоните ssc.socket().accept(), а не ssc.accept(). Если вы измените последнюю строку на ssc.accept(), тогда она будет работать как положено, то есть будет возвращать SocketChannel, если он ожидает, или ноль, если нет.
ssc.socket().accept()
ssc.accept()
Потому что так говорит javadoc для serversocket.accept ()?
IllegalBlockingModeException - если у этого сокета есть связанный канал, и канал находится в неблокирующем режиме.