Java - сокет читает из datainputstream и не застревает в нем
Я пытался установить связь с другого языка для Java, но когда я пытаюсь прочитать данные из DataInputStream в цикле while...
static String getData(DataInputStream stream){
int charbyte;
StringBuilder strbuilder = new StringBuilder();
try {
while ((charbyte = stream.read()) != -1){
strbuilder.append(Character.toChars(charbyte));
}
stream.close();
return new String(strbuilder);
} catch (Exception e) {
return null;
}
}
Проблема в том, что stream.read() не возвращает -1, потому что он просто ожидает отправки новых данных. Как я могу получить только что отправленные данные?
1 ответ
Решение
Метод никогда не возвращается, потому что цикл while никогда не заканчивается, и это вызвано тем, что соединение или DataInputStream остаются открытыми.
Чтобы отправить переменное число байтов по сетевому соединению, когда читатель читает поток символов, у вас есть три варианта:
- Отправьте число байтов для последующего, как int в сетевом порядке, а затем столько же байтов.
- Если байты являются печатными символами, отправьте нулевой байт, чтобы указать конец.
- Закройте поток после отправки байтов.
Для #1 измените цикл на
try {
int count = stream.readInt();
for( int i = 0; i < count; ++i ){
strbuilder.append(Character.toChars(stream.read()));
}
return strbuilder.toString();
}
Для № 2 используйте
try {
while ((charbyte = stream.read()) != 0){
strbuilder.append(Character.toChars(charbyte));
}
return strbuilder.toString();
}
Код у вас сейчас для #3.