BufferedOutputStream объединяет два последовательных вызова flush()

Я хочу отправлять отдельные сообщения, используя BufferedOutputStream. Так и делаю bos.write(msg1); bos.flush(); bos.write(msg2); bos.flush(), С другой стороны, у меня есть BufferedReader, который полагается на разделение этих сообщений:

BufferedReader br = new BufferedReader(new InputStreamReader(server.getInputStream()));
InputStream is = server.getInputStream();
while (true) {
    if (br.ready()) {
        byte[] bytes = new byte[is.available()];
        is.read(bytes);
    }
}

Но то, что я получаю, выглядит примерно так: "Отправка 30 байтов клиенту; Отправка 30 байтов клиенту", а с другой стороны: "Получено 60 байтов".

2 ответа

Поведение, которое вы упоминаете, исходит от TCP, а не от BufferedOutputStreamи причина в том, что в TCP нет такой вещи, как сообщение, и, следовательно, нет никакой гарантии какого-либо соответствия между размерами записи и размерами чтения. Это протокол потока байтов. Если вам нужны границы сообщений, вы должны указать их самостоятельно.

Вы не должны использовать ready() а также available() таким образом, либо. Просто используйте буфер фиксированного размера и блокируйте.

Это помогло мне решить мою проблему: http://www.codeproject.com/Articles/11922/Solution-for-TCP-IP-client-socket-message-boundary

Что я в основном делаю сейчас, так это сначала проверяю длину полезной нагрузки и, используя это, я определяю границу сообщения. После этого я могу продолжить с другими сообщениями.

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