закрытие неблокирующего канала сокета - PullRequest
0 голосов
/ 02 февраля 2012

Я хочу закрыть неблокирующий канал сокета Java после записи строки byebye. Однако методы в неблокирующем режиме возвращаются немедленно, поэтому вызов close() может привести к тому, что выполняемая операция записи выдает ClosedChannelException.

Я могу придумать 2 обходных пути:

  1. Вывести поток и подождать несколько миллисекунд перед закрытием.
  2. Переключиться в режим блокировки перед закрытием, но Документ Java говорит:

    «Канал должен быть переведен в неблокирующий режим до регистрации с помощью селектора и не может быть возвращен в режим блокировки до тех пор, пока он не будет отменен»

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

Код:

String msg = "byebye";
channel.write(ByteBuffer.wrap(msg.getBytes()));
channel.close();

1 Ответ

1 голос
/ 06 февраля 2012

вызов close () может привести к выполнению операции записи ClosedChannelException.

Нет, не будет. Это исключение выдается методом write () . После выхода из метода write () его нельзя бросить. Данные остаются в буфере вывода сокета ядра для записи.

...