@kirawa

Как прочитать данные из сокета?

Добрый день. У меня немного специфичное API, которое отдает массив байт, который нужно разобрать как массив данных или как строку. Если я принимаю массив с большим размером, к примеру 6000, то с 3000 идут одни нули в следующих позициях массива. Через debug самое странное, все хорошо, если точку остановки поставить выше условия if - все хорошо. А если точку остановки поставить уже ниже, то вот с 3000 идут одни нули в следующих позициях массива. Помогите пожалуйста разобраться что не так.
private String receive() throws NullPointerException, IOException {
        int lengthHeader = 19;
        byte[] answerHeader = new byte[lengthHeader];
        in.read(answerHeader);
        byte[] bytesLength = Arrays.copyOfRange(answerHeader, 15, lengthHeader);
        int lengthBody = bitConverterToInt32(bytesLength);
        byte[] answer = new byte[lengthBody];
        in.read(answer);
        if (answer[0] == 0) {// строка
            return new String(Arrays.copyOfRange(answer, 5, answer.length), Charset.forName(CHARSET_UTF16LE));
        } else {//массив
            StringBuilder builder = new StringBuilder();
            byte[] lengthCommand = Arrays.copyOfRange(answer, 1, 2);
            byte[] bytesRows = Arrays.copyOfRange(answer, 5, 6);
            int maxRows = bytesRows[0];
            int currentPos = lengthCommand[0] + 5 + 4;
            for (int i = 0; i < maxRows; i++) {
                byte[] bytes = Arrays.copyOfRange(answer, currentPos, currentPos + 4);
                int rowLength = bitConverterToInt32(bytes);
                currentPos += 4;
                String splitter = i == 0 ? "" : "|";
                builder.append(splitter);
                byte[] bytes1 = Arrays.copyOfRange(answer, currentPos, currentPos + rowLength);
                String s = new String(bytes1, Charset.forName(CHARSET_UTF16LE));
                builder.append(splitter);
                builder.append(s);
                currentPos += rowLength;
            }
            return builder.toString();
        }
    }

5d8b5ed733ade009960362.png
5d8b5f437f4d8614663031.png
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 1
Keanor
@Keanor
Ведущий разработчик
in.read(answerHeader) - возвращает кол-во прочитанных байт, не стоит закладываться на то что прочитано будет всегда столько сколько вы ожидаете (чаще будет наоборот).

не игнорируйте предупреждения idea :)

если хотите заблокироваться пока не получите нужное количество байт то используйте readNBytes (с java 11).

// read to EOF which may read more or less than buffer size
while ((n = read(buf, nread, Math.min(buf.length - nread, remaining))) > 0) {
    nread += n;
    remaining -= n;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
29 мар. 2024, в 11:11
10000 руб./за проект
29 мар. 2024, в 10:00
10000 руб./за проект
29 мар. 2024, в 09:59
750 руб./в час