Любой способ получить тайм-ауты чтения с Java NIO / селекторы? - PullRequest
2 голосов
/ 18 апреля 2010

Я преобразую серверное приложение Java, которое использовало блокирование ввода-вывода и потока на клиенте, в NIO и один поток ввода-вывода (возможно, пул потоков после того, как я выполнил базовую реализацию). Единственное, с чем я сталкиваюсь, это отключение клиентов после того, как они простаивают в течение определенного периода.

Ранее я использовал SO_TIMEOUT и блокировал чтение. Однако при использовании ввода-вывода на основе селектора чтение не блокируется ... Я надеялся, что смогу установить тайм-аут и выбрать при тайм-ауте чтения что-то вроде SelectionKey.isReadTimeout (), но ничего подобного кажется, что существует.

Текущее лучшее решение, которое я нашел, - это иметь таймер с TimerTask для каждого канала, который ожидает чтения, а затем отменять и перепланировать каждый раз, когда происходит чтение. Есть ли лучшее решение?

Ответы [ 2 ]

4 голосов
/ 18 апреля 2010

Я просто смотрел на то, как я справился с этим в куске кода, который я написал около года назад. Это был мой первый раз, когда я играл с nio (и вообще-то последний ... с тех пор я был далеко от Java). Я не знаю, является ли это идеальным решением, НО ...

Каждый раз, когда я читаю данные из сокета, я сохраняю текущее время в объекте, хранящемся в SelectionKey.attachment(). Периодически я перебираю SelectionKeys, проверяю время и запускаю дискотеки, которые простаивали в течение определенного времени.

0 голосов
/ 18 апреля 2010

Ваше решение использования таймера - это способ, которым я, вероятно, хотел бы сделать это.

Альтернативным решением будет проверка каждого соединения каждый раз, когда возвращается select.Вы можете использовать метод select, который принимает параметр тайм-аута и настраивает этот тайм-аут в соответствии с вашими требованиями.Это будет включать ведение информации о том, когда каждое соединение последний раз получало данные.

...