1

我想使用 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 个字节”。

4

2 回答 2

2

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

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

于 2015-07-18T20:02:03.343 回答
0

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

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

于 2015-07-19T22:25:40.800 回答