Arhn - архитектура программирования

Тайм-аут чтения для NIO SocketChannel?

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

27.06.2013

Ответы:


1

Либо:

  1. Вы используете Selector, и в этом случае у вас есть время ожидания, с которым вы можете играть, и если оно срабатывает (select(timeout) возвращает ноль), вы закрываете все зарегистрированные каналы или

  2. Вы используете режим блокировки, и в этом случае вы можете подумать, что должны иметь возможность вызывать Socket.setSoTimeout() в базовом сокете (SocketChannel.socket()) и перехватывать SocketTimeoutException, который выдается по истечении времени ожидания во время read(), но вы не можете, потому что это не поддерживается для сокетов, происходящих как каналы, или

  3. Вы используете неблокирующий режим без Selector, и в этом случае вам нужно перейти на случай (1).

Таким образом, вам нужно либо использовать случай (1), либо java.net.Socket напрямую.

27.06.2013
  • Я использую случай 1. Но, насколько я понимаю, выбор (тайм-аут) срабатывает, если каналы вообще не выбраны. Что мне нужно сделать, так это закрыть уже подключенный SocketChannel, если он не отправляет никаких читаемых данных (т. е. изменение с OP_ACCEPT на OP_READ) в течение заданного времени. Я имею смысл? 28.06.2013
  • Конечно, но вы не можете сделать это напрямую в случае 1. Вам нужно будет отслеживать время последнего чтения для каждого канала и манипулировать тайм-аутом выбора, чтобы тайм-аут наименее недавно прочитанного канала истекал, если ничего не происходит, проверьте все каналы на наличие тайм-ауты и т.д. 28.06.2013
  • Попробую это, спасибо! 01.07.2013
  • Извините, что вы имели в виду под «манипулировать тайм-аутом выбора»? 01.07.2013
  • В соответствии с этот предыдущий вопрос случай № 2 не будет работать. У него есть ответ, показывающий, как это сделать. 08.02.2015
  • @ Сэм Эрр, изменить его значение? 04.06.2020

  • 2

    Я искал ту же рекомендацию и не мог легко ее найти - делюсь ею здесь.

    Для netty есть хороший обработчик: ReadTimeoutHandler.

    Можно использовать так

    channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));
    

    он сбросит io.netty.handler.timeout.ReadTimeoutException, если не сможет увидеть какие-либо данные, выполняющие определенный тайм-аут чтения.

    15.09.2017
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..