ObjectStream Сбои - PullRequest
       6

ObjectStream Сбои

0 голосов
/ 30 июня 2010

Сегодня у меня есть проблема с ObjectStream (вход, а также выход). Я использовал Input и OutputStream, которые пришли прямо из сокета.

Во время инициализации потоков мой работает, работает и работает. Без сообщения об ошибке. Я не получил сообщение об ошибке. Кажется, что конструктор ObjectInputStream работает бесконечно ...

Вот код, где существует проблема. socket.isConnected было истиной.

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 01 июля 2010

Я нашел это

Создать ObjectOutputStream перед ObjectInputStream Если вы пишете код, который передает данные в двух направлениях, используя ObjectInputStream и ObjectOutputStream, будьте осторожны, чтобы сначала создать ObjectOutputStream.

Если вы вместо этогосначала создайте ObjectInputStream, оба конца будут блокироваться и в конечном итоге потерпят неудачу в конструкторе.Это связано с тем, что конструктор входного потока ожидает поступления исходной строки байтов из объекта ObjectOutputStream open ().В однонаправленном случае, когда одна сторона пишет, а другая читает, все идет гладко.Однако в двунаправленном случае, если обе стороны пытаются сначала создать входной поток, обе ожидают, пока другая сторона создаст выходной поток, и ни одна из них не может продолжить.

Если обработка исключений позволяет связям продолжаться после созданиявходной поток завершается неудачно, тогда симптомы этой проблемы заключаются в том, что обе стороны блокируются в течение некоторого периода времени, одна получает исключение и переходит к созданию ObjectOutputStream.Затем другой конец может создать свой ObjectInputStream, поскольку только что поступила последовательность инициализации.

К счастью, это просто.Переместите создание ObjectOutputStream до создания ObjectInputStream.Затем каждый конец передаст последовательность инициализации, прежде чем пытаться открыть свой входной поток.Последовательность инициализации готова и ожидает, поэтому построение входного потока идет нормально, и тогда передача объекта может начаться без какой-либо задержки.

0 голосов
/ 01 июля 2010

Входной поток объекта читает заголовок, отправленный созданным им выходным потоком объекта.Если вы не отправили заголовок, он будет ждать вечно.

Простое решение - ВСЕГДА создавать сначала поток вывода объекта и очищать его перед созданием потока ввода объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...