Почему в моем приложении readInt () всегда генерирует исключение EOFException? - PullRequest
2 голосов
/ 22 марта 2009

(Простите, потому что я не очень часто пишу на Java.)

Я пишу клиентское сетевое приложение на Java, и у меня возникла интересная проблема. Каждый вызов readInt () выдает EOFException. Переменная имеет тип DataInputStream (инициализируется как: DataInputStream din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));, где sock имеет тип Socket).

Теперь sock.isInputShutdown() возвращает false, а socket.isConnected() возвращает true. Я предполагаю, что это означает, что у меня есть действительное соединение с другой машиной, к которой я подключаюсь. Я также провел другие проверки, чтобы убедиться, что я правильно подключен к другой машине.

Возможно ли, что DataInputStream был настроен неправильно? Есть ли какие-то предварительные условия, которые я пропустил?

Любая помощь очень ценится.


@ tofubeer: На самом деле я записал 17 байтов в сокет. Разъем подключен к другой машине, и я жду ввода от этой машины (извините, если это было неясно). Сначала я успешно прочитал из потока (чтобы инициировать рукопожатие), и это сработало просто отлично. Сейчас я проверяю, не искажены ли мои отправленные запросы, но я так не думаю. Кроме того, я попытался прочитать один байт из потока (через read()), и он вернул -1.

Ответы [ 2 ]

0 голосов
/ 22 марта 2009

Что нужно проверить:

  • Рукопожатие потребляло больше 13 байтов, оставляя меньше четырех для readInt ()?
  • Было ли записано целое число, которое вы хотите прочитать с помощью DataOutputStream.writeInt ()?
  • Вы очистили поток от отправителя?

Редактировать : Я взглянул на исходники Java (у меня на рабочем столе 1.4, не знаю, какую версию вы используете), и проблема может быть в BufferedInputStream. DataInputStream.readInt () просто вызывает BufferedInputStream.read () четыре раза. BufferedInputStream.read () вызывает BufferedInputStream.fill (), если его буфер исчерпан (например, если его первое чтение только получило 16 байтов). BufferedInputStream.fill () вызывает базовый метод read (byte [], int, int) InputStream, который по контракту может фактически ничего не читать! Если это произойдет, BufferedInputStream.read () вернет ошибочный EOF.

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

Я подозреваю, что ваш BufferedInputStream получает только первые 16 байтов потока при первом чтении. Мне было бы любопытно, что ваш DataInputStream available () возвращает прямо перед readInt. Если вы еще этого не сделали, я бы посоветовал вам сбросить свой OutputStream после написания int, который вы не можете прочитать, в качестве возможного обходного пути.

0 голосов
/ 22 марта 2009

Вы пишете 4 байта в сокет? Согласно JavaDoc он генерирует исключение EOFException, если этот поток достигает конца перед чтением всех байтов.

Попробуйте вызвать readByte () 4 раза подряд вместо readInt () и посмотрите, что произойдет (вероятно, не все из них будут работать).

Изменить (с учетом вашего редактирования).

Узнайте, сколько раз вы можете вызвать read (), прежде чем вы получите -1.

Когда read () возвращает -1, это означает, что он достиг конца файла.

Также выясните, что возвращает каждая функция read (), чтобы убедиться, что то, что вы читаете, является тем, что вы действительно выписали.

Звучит как проблема либо с чтением читаемого кода, чем с вашей работой во время рукопожатия, либо с другой стороны, не пишущей то, что, по вашему мнению, оно пишет.

...