Java - сокет читается из потока ввода данных и не застревает в нем

Я пытался установить связь с другого языка на 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, потому что он просто ожидает отправки новых данных. Как я могу просто получить данные, которые были только что отправлены?


person user3818650    schedule 25.01.2015    source источник
comment
Как вы создаете DataInputStream? Вы вообще получаете байты? Другая сторона действительно посылает?   -  person laune    schedule 25.01.2015
comment
Итак, я получаю поток ввода с помощью .getInputStream() в объекте сокета и использую его для нового DataInputStream.   -  person user3818650    schedule 25.01.2015
comment
Затем через другой язык я отправил данные   -  person user3818650    schedule 25.01.2015
comment
Откуда вы знаете, что другая сторона действительно посылает? Закрывает ли другая сторона соединение, чтобы вы почувствовали EOF на стороне Java?   -  person laune    schedule 25.01.2015
comment
Я делаю соединение, потому что этот скрипт на самом деле находится в java-сервере, а затем я отправляю. В цикле while я поместил тестовые данные для печати charbyte, а целые были напечатаны   -  person user3818650    schedule 25.01.2015
comment
Вопрос. Закрывает ли другая сторона соединение, чтобы вы почувствовали EOF на стороне Java?   -  person laune    schedule 25.01.2015
comment
Нет, другая сторона не закрывает соединение, потому что это не единственное общение, которое я хочу.   -  person user3818650    schedule 25.01.2015
comment
Тогда вы никогда не увидите -1. Смотрите мой ответ.   -  person laune    schedule 25.01.2015
comment
Не единственная связь - между сервером и этим клиентом? Или сервер и любой другой клиент?   -  person laune    schedule 25.01.2015
comment
В основном клиент отправляет данные на сервер, но для меня нет проблем с отправкой сервера на клиент.   -  person user3818650    schedule 25.01.2015


Ответы (1)


Метод никогда не возвращается, потому что цикл while никогда не заканчивается, и это вызвано тем, что соединение или DataInputStream остаются открытыми.

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

  1. Отправьте количество следующих байтов в виде целого числа в сетевом порядке, за которым следует столько же байтов.
  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.

person laune    schedule 25.01.2015
comment
Принимающая сторона? Передающая сторона? - person laune; 25.01.2015
comment
Получение в цикле while на сервере - person user3818650; 25.01.2015