Получение строки utf-8 с использованием InputStreamReader из сокета? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь получить строку с устройства, используя этот код:

        byte[] buf = new byte[4];
        int read = inFromDevice.read(buf);
        Logger.getLogger(Utill.class.getName() + " DEBUG_ERR01").log(Level.INFO, "Bytes read: {0}", read);
        int msgLength = ByteBuffer.wrap(buf).getInt();
        Logger.getLogger(Utill.class.getName() + " DEBUG_ERR01").log(Level.INFO, "Message length: {0}", msgLength);
        Reader r = new InputStreamReader(inFromDevice);
        char[] cb = new char[msgLength];
        int actualCharsRead = r.read(cb);
        Logger.getLogger(Utill.class.getName() + " DEBUG_ERR01").log(Level.INFO, "Actual chars read: {0} char array length: {1}", new Object[]{actualCharsRead, cb.length});
        String msgText = String.valueOf(cb, 0, cb.length);
        Logger.getLogger(Utill.class.getName() + "Messages Loggining recieve: ").log(Level.INFO, msgText);
        return msgText;

inFromDevice и InputStream получены из принятого ServerSocket.

Код работает и возвращает сообщения большую часть времени, но иногда я получаю сообщения меньше, чем msgLength (что неверно согласно протоколу)

Пример из журнала: Actual chars read: 1020 char array length: 1391

Я думаю, что проблема внешняя из-за проблемы с сетью или проблемы с устройством, но мне нужно некоторое экспертное понимание этого. Есть ли в Java известные проблемы, которые могут вызвать это?

1 Ответ

2 голосов
/ 09 апреля 2019

InputStreamReader будет блокироваться только до тех пор, пока не сможет прочитать один символ в буфере или обнаружить EOF.Нет никакой гарантии, что буфер будет заполнен.

Если в вашем протоколе указана длина отправляемой строки, получатель должен выполнить цикл, отслеживая количество оставшихся символов до тех пор, пока все не будут прочитаны.

...