У меня есть клиент сокета TCP, получающий сообщения (данные) с сервера.
сообщения имеют тип длины (2 байта) + данные (длина байта), разделенные символами STX и ETX.
Я использую bufferedReader для извлечения двух первых байтов, декодирования длины, затем снова считываю из того же bufferedReader подходящей длины и помещаю результат в массив символов.
Большую часть времени у меня нет проблем, но НЕКОТОРЫЕ (1 из тысяч полученных сообщений), когда я пытаюсь прочитать (длину) байтов от читателя, я получаю только часть этого, остальная часть моего массива заполнены символами "NUL". Я полагаю, это потому, что буфер еще не заполнен.
char[] bufLen = new char[2];
_bufferedReader.read(bufLen);
int len = decodeLength(bufLen);
char[] _rawMsg = new char[len];
_bufferedReader.read(_rawMsg);
return _rawMsg;
Я решил проблему несколькими итерационными способами:
сначала я проверил последний символ моего массива: если бы это был не ETX, я бы считывал символы из bufferedReader один за другим, пока не достигнул бы ETX, а затем начал с обычной процедуры.
Следствием этого является то, что я в основном УДАЛУ одно сообщение.
затем, чтобы по-прежнему получить это сообщение, я обнаружил первый случай появления символа NUL в моем «усеченном» сообщении, прочитал и сохранил дополнительные символы по одному, пока я не достиг ETX, и добавил их на мои "усеченные" сообщения, подтверждающие длину в порядке.
это также работает, но я действительно думаю, что есть кое-что, что я мог бы сделать лучше, например, проверить, доступно ли в буфере общее количество символов, которое мне нужно, перед чтением, но не могу найти правильный способ сделать это ...
любая идея / указатель?
спасибо!