Основы вызовов iostream и read / writeObject - PullRequest
17 голосов
/ 08 октября 2011

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

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

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

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

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

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

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

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

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

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

Тест 2 (FAIL)

  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)

Ответы [ 4 ]

1 голос
/ 01 марта 2012

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

  1. Создать ObjectOutputStream
  2. Сбросить
  3. Создайте ObjectInputStream

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

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

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

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

0 голосов
/ 29 февраля 2012

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

objectOutputStream.writeObject(message) ;

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

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

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

0 голосов
/ 24 февраля 2012

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

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

...