Как правильно закрыть неблокирующий канал сокета? - PullRequest
4 голосов
/ 03 декабря 2010

Я пишу серверную программу с использованием неблокирующего Java SocketChannel.Иногда я хочу отправить ответное сообщение, а затем закрыть канал, как показано в следующем коде.

Однако метод close () прерывает метод write (), я получаю исключение java.nio.channels.ClosedChannelException исообщение не отправлено.

Я могу открыть поток и подождать 1-2 секунды, прежде чем закрыть канал, но я чувствую, что создание другого потока расточительно.

Что является правильнымспособ закрыть SocketChannel, пока есть ожидающие операции?

String msg = "Wrong password!";
channel.write(ByteBuffer.wrap(msg.getBytes()));
channel.close();

1 Ответ

0 голосов
/ 03 декабря 2010

канал. сокет (). setSoLinger (true, MAX_SECONDS_FOR_OUTPUT_TO_DRAIN);

См. Информацию о параметре linger .Как уже упоминалось, это приведет к тому, что close () будет блокироваться в течение максимум MAX_SECONDS_FOR_OUTPUT_TO_DRAIN секунд.

...