Я программирую простой сервер Java NIO и испытываю небольшую головную боль: я получаю нормальный InputStream
si, необходимо передать по конвейеру своим клиентам.У меня есть один поток, выполняющий все записи, поэтому возникает проблема: если InputStream
блоки, все другие записи соединения будут приостановлены.
Я могу использовать InputStream.available()
для проверкиесли есть какие-либо входящие данные, которые я могу прочитать без блокировки, но если я достиг конца потока, мне кажется, что должен позвонить read()
, чтобы узнать.
Это создает крупнуюголовная боль для меня, но я не могу поверить, что у меня эта проблема возникла первой.
Единственные варианты, которые я до сих пор предлагал:
- Естьотдельный поток для каждого
InputStream
, но это просто глупо, поскольку я использую неблокирующий ввод-вывод.Я также мог бы сделать это с помощью пула потоков, но, опять же, это ограничивает количество одновременных клиентов, которым я могу передать InputStream
. - Имею отдельный поток, считывающий эти потоки с таймаутом (использующий другой поток для прерыванияесли чтение длилось дольше определенного времени), но это наверняка задушит поток данных, если у меня будет много открытых
InputStream
s, не доставляющих данные.
Конечно, если бы была магия InputStream.isEof()
или isClosed()
, тогда это вообще не было бы проблемой: '(