Записать содержимое InputStream (блокирующий) в неблокирующий сокет - PullRequest
3 голосов
/ 05 апреля 2011

Я программирую простой сервер Java NIO и испытываю небольшую головную боль: я получаю нормальный InputStream si, необходимо передать по конвейеру своим клиентам.У меня есть один поток, выполняющий все записи, поэтому возникает проблема: если InputStream блоки, все другие записи соединения будут приостановлены.

Я могу использовать InputStream.available() для проверкиесли есть какие-либо входящие данные, которые я могу прочитать без блокировки, но если я достиг конца потока, мне кажется, что должен позвонить read(), чтобы узнать.

Это создает крупнуюголовная боль для меня, но я не могу поверить, что у меня эта проблема возникла первой.

Единственные варианты, которые я до сих пор предлагал:

  • Естьотдельный поток для каждого InputStream, но это просто глупо, поскольку я использую неблокирующий ввод-вывод.Я также мог бы сделать это с помощью пула потоков, но, опять же, это ограничивает количество одновременных клиентов, которым я могу передать InputStream.
  • Имею отдельный поток, считывающий эти потоки с таймаутом (использующий другой поток для прерыванияесли чтение длилось дольше определенного времени), но это наверняка задушит поток данных, если у меня будет много открытых InputStream s, не доставляющих данные.

Конечно, если бы была магия InputStream.isEof() или isClosed(), тогда это вообще не было бы проблемой: '(

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

" ..... Иметь отдельный поток для каждого InputStream, однако это просто глупо, поскольку я в первую очередь использую неблокирующий ввод / вывод .... "

Это совсем не глупо.Сначала вам нужно проверить, можете ли вы получить SelectableChannel из вашей реализации InputStream.Если это так, то вам повезло, и вы можете просто зарегистрировать его с помощью селектора и делать как обычно.Но есть вероятность, что ваш InputStream может иметь канал, который не является SelectableChannel, и в этом случае «иметь отдельный поток для каждого InputStream» - очевидная вещь, и, вероятно, правильная.

Обратите внимание, чтоаналогичная проблема, обсуждаемая в SO, о неспособности получить SelectableChannel из входного потока .К сожалению, вы застряли.

0 голосов
/ 05 апреля 2011

У меня есть один поток, выполняющий все записи

Вы остановились, чтобы рассмотреть, является ли это частью проблемы, а не частью решения?

...