BufferedOutputStream连接两个连续的flush()调用

时间:2015-07-18 18:33:41

标签: java flush bufferedoutputstream

我想使用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 个答案:

答案 0 :(得分:2)

您提到的行为来自TCP,而不是来自BufferedOutputStream,原因是TCP中没有消息,因此不保证写入大小和读取大小之间的任何对应关系。它是一个字节流协议。如果您想要消息边界,则必须自己提供。

您也不应该以这种方式使用ready()available()。只需使用固定大小的缓冲区,然后阻止。

答案 1 :(得分:0)

这有助于我解决我的问题:http://www.codeproject.com/Articles/11922/Solution-for-TCP-IP-client-socket-message-boundary

我现在基本上做的是先检查有效负载长度,然后使用它确定消息边界。之后我可以继续其他消息。