#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 (ПРОХОЖДЕНИЕ)
- Проект TestServer, запустите его как Java-приложение
- Проект TestClient, запустите его как приложение для Android
Вывод на консоль
Открыт сокет сервера /127.0.0.1
Клиентский сокет принят
Создан входной поток
Создан выходной поток
Созданный объект чтения
Тест 2 (СБОЙ)
- Проект TestServer, запустите его как Java-приложение
- Проект 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:
Не уверен, вызывает ли это эту конкретную проблему, но вы всегда должны использовать этот порядок при создании потоков объектов:
- Создать
ObjectOutputStream
- Очистите его
- Создать
ObjectInputStream
Я вижу, что, по крайней мере, на стороне сервера вы создали ObjectInputStream
первый и не очистили поток, что может вызвать ваши проблемы.
Вот больше информации о теме и причинах этого порядка.
Комментарии:
1. Не знаю, поможет ли это. Но постараюсь отчитаться.
Ответ №2:
Вы должны выбрать порт сервера выше 1024, так как все указанные ниже порты зарезервированы для известных служб. Просто выберите порт между 1024 и 65535 и посмотрите, работает ли он тогда.
Также я бы посоветовал вам обернуть ваш ObjectInputStream в BufferedInputStream; Может случиться так, что, как только ваше соединение не будет таким устойчивым, оно завершится сбоем.
Комментарии:
1. Хорошо, я попробую это. Я не думаю, что это сработает, но я попробую и отчитаюсь.
Ответ №3:
Я думаю, это связано с тем, что ваш клиент завершает работу после выполнения
objectOutputStream.writeObject(message) ;
Поэтому попробуйте ввести искусственную задержку после этой строки и посмотрите.
Во всех случаях, когда клиент / сервер закрывает соединения / завершает программу, другой конец выдает это исключение EOF, если он ожидает какого-либо ввода (например, inputObjectStream.readObject())
поэтому убедитесь, что все, что написано клиентом, правильно прочитано сервером до завершения работы клиента. Итак, введите некоторую задержку на клиенте и посмотрите.
Комментарии:
1. Интересно, попробую вернуться.
2. Нет, это не помогло. Также задержка создает некоторую несогласованность в дизайне.
Ответ №4:
Пожалуйста, очистите поток на стороне клиента. Я надеюсь, что это должно решить проблему.