Подтвердить что ты не робот

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

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

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

Теперь, если я запускаю код на эмуляторе/устройстве Android, отлично работает. Тот же кусок кода, если я запускаю "тестовый пример junit java для Android", получаю исключение после обработки всех моих запросов. Исключение находится на стороне сервера при вызове 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?

Edited

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

Тест 1 (PASS)

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

Консольный выход

Открыт серверный сокет /127.0.0.1

Принимается клиентский сокет

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

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

Чтение созданного объекта

Тест 2 (FAIL)

  • Проект TestServer, запустите его как приложение Java
  • Проект TestClient, запускайте его как Android Junit Test

Консольный выход

Открыт серверный сокет /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)
4b9b3361

Ответ 1

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

  • Создать ObjectOutputStream
  • Сбросить его
  • Создать ObjectInputStream

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

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

Ответ 2

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

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

Ответ 3

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

objectOutputStream.writeObject(message) ;

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

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

убедитесь, что все, что написано клиентом, правильно прочитано сервером до того, как клиент завершит работу. Так что добавьте задержку на клиенте и посмотрите.

Ответ 4

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