Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedOutputStream连接两个连续的flush()调用_Java_Flush_Bufferedoutputstream - Fatal编程技术网

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

Java BufferedOutputStream连接两个连续的flush()调用,java,flush,bufferedoutputstream,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.getInput

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

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


您也不应该以这种方式使用
ready()
available()
。只需使用固定大小的缓冲区和块。

这帮助我解决了问题:


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

无需连接flush()。只需在发送数据的代码末尾调用此方法。谢谢您的回答。我理解这个问题,但我仍在努力找到一个好方法来解决这个问题。我想将任意长度的字符串封装在WebSocket框架中,然后使用BufferedOutputStream将其发送过来。您仍然建议使用固定大小的缓冲区吗?如何确保使用固定大小的缓冲区获得正确的边界?实现消息的方法有很多种。1.每封邮件的长度相同。2.字长前缀。3.键入长度值。4.像XML这样的自描述协议。5.已编译的协议,如XDR、ASN.1、BER等。。。您可以使用任何具有固定大小字节数组缓冲区的缓冲区。