Как немедленно завершить блокировку streamа при операции ввода-вывода сокета?

В контексте Java я создаю новый stream для чтения сетевого ввода при открытии windows GUI, и когда я закрываю окно, я хочу освободить ресурс сокета и немедленно прекратить stream. Теперь я использую метод setSoTimeout, но я не хочу ждать исключения тайм-аута. Может ли кто-нибудь дать какое-нибудь предложение? Благодаря!

Существуют (потенциально) три способа сделать это:

  • Вызов 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; } 
  • Как исправить java.net.SocketException: Неработающая труба?
  • Передача структуры через Sockets в C
  • C # Установленное соединение было прервано программным обеспечением вашей хост-машины
  • Невозможно присвоить запрошенный адрес: JVM_Bind
  • Что вызывает мой java.net.SocketException: сброс соединения?
  • Пробуждать stream заблокирован при вызове accept ()
  • Правильное закрытие SSLSocket
  • Как обнаружить ближайший боковой разъем?
  • была предпринята попытка получить доступ к сокету таким образом, чтобы запретить его разрешения доступа. Зачем?
  • java.net.SocketException: программное обеспечение вызвало прерывание соединения: recv failed
  • Почему мой клиентский сокет не получает то, что посылает мой серверный сокет?
  • Interesting Posts

    Android: получите информацию о программном обеспечении

    Как я могу навсегда скрыть значки в области уведомлений?

    Как добавить точку останова в objc_exception_throw?

    Windows 7 неожиданно загружается на блестящий пустой экран на Lenovo T410

    Ошибка при установке Ant: ANT_HOME установлен неправильно

    Почему я заблокировал перетаскивание окон через границы экрана (несколько мониторов) в Windows 10?

    Файлы cookie ASP.NET_SessionId + OWIN не отправляются в браузер

    Автоматически останавливать сборку Visual C ++ 2008 при первой ошибке компиляции?

    Динамический class в Angular.js

    Рабочая станция VMware: как уменьшить максимальный размер .vmdk

    Как разбить вектор на группы регулярных последовательных последовательностей?

    Android 1.5: Чтение SMS-сообщений

    безопасно ли поддерживать подключение к базам данных в течение длительного времени

    Создать экземпляр объекта без вызова конструктора?

    Преобразование формата даты в Android

    Давайте будем гением компьютера.