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