Забавно, но кто-то сегодня уже разместил ссылку на Заблуждения распределенных вычислений .
В вашем случае, как говорит мне хороший переводчик с немецкого на английский An existing connection was forcibly closed by remote host
.
Когда вы имеете дело с вводом / выводом, в частности с сокетным вводом / выводом, вы должны быть готовы к тому, что любое исключение IOException будет выдано вам.
С некоторыми из них, например ClosedByInterruptException
, вы можете справиться с умом. Другие, вы можете
- Добавьте
throws
декларации к вашему методу и разрешите вызывающим объектам работать с IOExceptions
- Обернуть исключения IOException в проверенное исключение, специфичное для вашей подсистемы
- Обернуть IOException в RuntimeException, специфичную для вашей подсистемы или нет
- Записать IOException и продолжить.
В любом случае, как только вы получите IOException, вы, вероятно, не сможете многое сделать для связи с этим каналом. Так что вы можете просто закрыть соединение и повторить попытку позже.
Кстати, read
вернет вам -1, только если вы SUCCESSFULLY достигли конца потока. В вашем случае, я уверен, соединение в середине потока закрыто.
РЕДАКТИРОВАТЬ в ответ на комментарии OP
Могу ли я запретить каналу быть
прерываемые
Нет, это свойство определенного канала, который вы используете. Если он реализует InterruptibleChannel
, то он прерывается и будет закрыт при получении прерывания потока. java.nio.channels.SocketChannel
прерывается
Документы для
Состояние ClosedByInterruptException:
«Проверено исключение, полученное
поток, когда другой поток прерывает
это пока он заблокирован в I / O
операция на канале. "Еще как
это может быть блокировка, если это
НЕБЛОКИРУЮЩИЙ IO?
Если вы посмотрите на спецификацию ReadableByteChannel.read
, вы увидите, что метод объявлен как бросающий IOException
. Затем в JavaDoc он указывает, какие конкретные исключения IOException и какие условия могут быть вызваны стандартной реализацией этого интерфейса java.nio. Это один из примеров совместного программирования. Декларатор интерфейса сообщает разработчику, как он должен реализовать метод и какие исключения он должен генерировать при каких условиях.
Например, если я реализую метод read в своем экзотическом канале, я могу выбрать полное игнорирование спецификации и не выбрасывать исключения в объявлении. Пользователь моего класса, тем не менее, вероятно, заплатит высокую цену, столкнувшись с неожиданным поведением, и, вероятно, откажется от моей реализации в пользу более надежной.
В любом случае, я думаю, вы не понимаете, как следует реагировать на различные исключения, объявленные в методе чтения.
Прежде всего, не каждое исключение в спецификации метода чтения может быть выброшено. Пример ClodesByInterruptException
, скорее всего, НЕ будет сброшен, если вы используете неблокирующий ввод / вывод. С другой стороны, некоторые разработчики могут выбрать закрытие канала после получения прерывания и выдать это исключение при попытке чтения, даже если вы используете неблокирующий ввод / вывод. Но вы действительно не должны связываться с этим решением, потому что:
- Вы, вероятно, контролируете ли ток
нить прервана или нет
- Это просто другой вид
IOException, и по умолчанию должен
быть фатальным
И да, пример IOEception
фатальный, но мой вопрос: они
ALL
Помните, что ваш фреймворк должен нормально функционировать или корректно завершаться при возникновении любых исключений. Например, ваш код или код библиотеки в любой момент может вызвать исключение без проверки (время выполнения). Только тестирование и более глубокое знание вашей среды могут сказать вам, какие исключения действительно фатальны, а какие можно безопасно обработать.
Поскольку фреймворки написаны людьми, у них также есть ошибки, недостатки и т. Д. Таким образом, может быть случай, когда выбрасывается IOException, но основной канал все еще в порядке. К сожалению, эти условия можно найти только с кровью и кишками в реальной производственной среде. Вот один из примеров, где IOException, генерируемое сокетом, может быть полностью проигнорировано: http://bugs.sun.com/view_bug.do?bug_id=4516760.
Итак, начните с написания универсального обработчика для всех исключений IOException и отнеситесь к ним как к фатальным, ослабьте его для определенных условий, которые вы обнаружите в рабочей среде.