Как немедленно завершить блокировку streamа при операции ввода-вывода сокета?
В контексте Java я создаю новый stream для чтения сетевого ввода при открытии windows GUI, и когда я закрываю окно, я хочу освободить ресурс сокета и немедленно прекратить stream. Теперь я использую метод setSoTimeout, но я не хочу ждать исключения тайм-аута. Может ли кто-нибудь дать какое-нибудь предложение? Благодаря!
- Как работает функция accept API ()?
- Сколько накладных расходов накладывает SSL?
- Простой сервер Http с Java / Socket?
- Использование .Net 4.5 Функция Async для программирования сокетов
- Разрешены ли параллельные вызовы send / recv в одном и том же сокете?
- Мгновенно обнаруживать отключение клиента от серверного сокета
- C # Begin / EndReceive - как читать большие данные?
- Отправить HTTP-запрос вручную через сокет
Существуют (потенциально) три способа сделать это:
-
Вызов
Socket.close()
в сокете закроет связанные объектыInputStream
иOutputStream
и приведет к разблокированию любых streamов, заблокированных в Socket или (связанных) streamовых операциях. Согласно javadoc, операции с самимSocketException
будутSocketException
. -
Вызов
Thread.interrupt()
будет (при некоторых обстоятельствах, которые не указаны) прервать операцию блокировки ввода-вывода, заставив ее вызыватьInterruptedIOException
.Обратите внимание на оговорку. По-видимому, подход «interrupt ()» не работает на «большинстве» современных платформ Java. (Если у кого-то еще было время и склонность, они могли бы расследовать обстоятельства, в которых работает этот подход. Однако сам факт, что поведение является специфичным для платформы, должен быть достаточным, чтобы сказать, что вы должны использовать его только в том случае, если вам нужна ваша заявка для работы на определенной платформе. В этот момент вы можете легко «попробовать» для себя.)
-
Возможный третий способ сделать это – вызвать
Socket.shutdownInput()
и / илиSocket.shutdownOutput()
. В javadocs явно не указано, что происходит с операциями чтения и / или записи, которые в настоящее время заблокированы, но небезосновательно думать, что они разблокируют и выдают исключение. Однако, если javadoc не говорит, что происходит, тогда поведение следует считать специфичным для платформы.
Я знаю, что этот вопрос старый, но, как кажется, никто не решил «тайну» Thread.interrupt()
на «современных платформах», я провел некоторое исследование.
Это проверено на Java 8 на Windows7 (64-разрядная версия) (но это, вероятно, будет верно и для других платформ).
Вызов Thread.interrupt()
не вызывает InterruptedIOException
Случается, что метод InputStream.read()
возвращается с параметрами -1
и Thread.interrupted()
-flag.
Таким образом, можно считать «исправленным» read (), бросающим InterruptedIOException
:
static final int read(Socket socket, byte[] inData) throws SocketTimeoutException, // if setSoTimeout() was set and read timed out InterruptedIOException, // if thread interrupted IOException // other erors { InputStream in = socket.getInputStream(); int readBytes = in.read( inData, 0, inData.length); if ( Thread.interrupted() ) { throw new InterruptedIOException( "Thread interrupted during socket read"); } return readBytes; }