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 остаются открытыми.

Чтобы отправить переменное число байтов по сетевому соединению, когда читатель читает поток символов, у вас есть три варианта:

  1. Отправьте число байтов для последующего, как int в сетевом порядке, а затем столько же байтов.
  2. Если байты являются печатными символами, отправьте нулевой байт, чтобы указать конец.
  3. Закройте поток после отправки байтов.

Для #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.

Другие вопросы по тегам