2014-01-27 2 views
0

Ситуация: Я посылаю логическую переменную через ObjectOutputStream от клиента к серверу. После этого я немедленно отправляю строковые данные через функцию writeChars(). Сервер получает логическое значение через readBoolean() и соответственно порождает поток. Он читает строку, используя readFully(bytes[]).Android: ObjectInputSteam.readFully() получает Stuck

Задача: Сервер зависает на линии ObjectInputStream.readFully(bytes[]).

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

+0

'readFully (bytes [])' хочет прочитать столько байтов, сколько есть в массиве 'byte', который вы передаете. Вы точно знаете, сколько «байтов» ожидать? Правильно ли размер массива? –

+0

Привет, Дэвид. Строка, которую я посылаю, просто: 8 ~ 9 ~ ^. Размер массива байтов равен 500. Должен ли быть точный размер? Как заставить его читать переменные строковые размеры? (если это возможно). – Abhishek

ответ

1

Если это String, и вы используете ObjectOutputStream, вы должны просто позвонить writeUTF(), чтобы написать его, и readUTF(), чтобы прочитать его. Этот метод фактически сначала записывает количество байтов в поток, а затем байты. На принимающей стороне он считывает количество байтов, а затем знает, сколько байтов ожидать.

+0

Дэвид, спасибо за предложение. Я думаю, я просто пропустил упоминание потока моего кода сервера. Поток читает логическое значение из объектаInputStream и порождает другой поток для чтения строки (теперь я помещаю UTF). Теперь, слушая readUTF, и в родительском потоке, он зацикливается назад, чтобы прослушивать следующую логическую переменную. Это вызывает проблему? (BTW, он теперь висит на строке readUTF тоже). – Abhishek

+1

Конечно, это вызывает проблему. Какой смысл второго потока? Он сражается с исходным потоком данных. Может произойти все, что угодно. Согласно вашему протоколу, исходный поток должен ждать, пока строка не будет прочитана, прежде чем она сможет разумно прочитать следующий логический код в любом случае, так что второй поток вообще не будет полезен. Просто прочитайте строку в исходном потоке. – EJP

+1

@EJP Спасибо. вы взяли слова прямо из моего рта ;-) –