Основы вызовов iostream и read / writeObject

#java #android #iostream #eof

#java #Android #iostream #eof

Вопрос:

Я разрабатываю сервер Java для ответа на несколько клиентских запросов. Таким образом, дизайн в основном имеет сокет сервера, принимает сокет клиента, создает inputObjectStream и outputObjectStream из потока ввода / вывода клиента.

Затем я использую writeobject на клиенте для выполнения запроса, readObject на сервере для получения запроса. Обработайте его, запишите объект обратно в тот же поток, что и ответ, и на стороне клиента readobject для обработки ответа.

Теперь, если я запускаю код на эмуляторе / устройстве Android, все работает нормально. Тот же фрагмент кода, если я запускаю «тестовый пример Android junit java», я получаю исключение после обработки всех моих запросов. Исключение находится на стороне сервера при вызове readObject.

 java.io.EOFException    at
java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2570)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)`
  

Вопрос
Является ли это правильным дизайном для чтения / записи объектов в iostream?

Отредактировано

У меня есть образец проекта, загруженный на 4shared.com (http://www.4shared.com/archive/98gET_pV/Issue15426tar.html ) ИЛИ (http://www.sendspace.com/file/v04zjp )

Тест 1 (ПРОХОЖДЕНИЕ)

  1. Проект TestServer, запустите его как Java-приложение
  2. Проект TestClient, запустите его как приложение для Android

Вывод на консоль

Открыт сокет сервера /127.0.0.1

Клиентский сокет принят

Создан входной поток

Создан выходной поток

Созданный объект чтения

Тест 2 (СБОЙ)

  1. Проект TestServer, запустите его как Java-приложение
  2. Проект TestClient, запустите его как тест Android Junit

Вывод на консоль

Открыт сокет сервера /127.0.0.1

Клиентский сокет принят

 Error : Unable to open server socket. Server wont load.
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2297)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2766)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297)
at com.test.server.myThread.run(Main.java:52)
at com.test.server.Main.main(Main.java:32)
  

Комментарии:

1. Можете ли вы опубликовать свои фактические тесты?

2. Я отредактировал свой пост и добавил проект eclipse. Если вы загрузите его, вы сможете легко его воспроизвести.

3. Получите пустую страницу при попытке загрузить ваш тестовый проект. Пожалуйста, опубликуйте его снова…

4. Я только что попробовал, я могу загрузить.

5. Я также безуспешно пытался загрузить его. Можете ли вы перепроверить свою ссылку или загрузить ее куда-нибудь еще?

Ответ №1:

Не уверен, вызывает ли это эту конкретную проблему, но вы всегда должны использовать этот порядок при создании потоков объектов:

  1. Создать ObjectOutputStream
  2. Очистите его
  3. Создать ObjectInputStream

Я вижу, что, по крайней мере, на стороне сервера вы создали ObjectInputStream первый и не очистили поток, что может вызвать ваши проблемы.

Вот больше информации о теме и причинах этого порядка.

Комментарии:

1. Не знаю, поможет ли это. Но постараюсь отчитаться.

Ответ №2:

Вы должны выбрать порт сервера выше 1024, так как все указанные ниже порты зарезервированы для известных служб. Просто выберите порт между 1024 и 65535 и посмотрите, работает ли он тогда.

Также я бы посоветовал вам обернуть ваш ObjectInputStream в BufferedInputStream; Может случиться так, что, как только ваше соединение не будет таким устойчивым, оно завершится сбоем.

Комментарии:

1. Хорошо, я попробую это. Я не думаю, что это сработает, но я попробую и отчитаюсь.

Ответ №3:

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

 objectOutputStream.writeObject(message) ;
  

Поэтому попробуйте ввести искусственную задержку после этой строки и посмотрите.

Во всех случаях, когда клиент / сервер закрывает соединения / завершает программу, другой конец выдает это исключение EOF, если он ожидает какого-либо ввода (например, inputObjectStream.readObject())

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

Комментарии:

1. Интересно, попробую вернуться.

2. Нет, это не помогло. Также задержка создает некоторую несогласованность в дизайне.

Ответ №4:

Пожалуйста, очистите поток на стороне клиента. Я надеюсь, что это должно решить проблему.