java调用OutputStream接口中flush方法,真的会立即刷新吗?

来源:互联网 发布:jsp网上图书系统源码 编辑:程序博客网 时间:2024/05/16 07:16

自己最近在做一个项目和socket通信有关,其中有段逻辑是这样的。其中我是发送方,另一个是接收方。

第一步:发送方向接收方发送一段消息。
第二步:接收方回复消息。消息内容为:发送方消息否发送成功。如果成功,接收方会再回复一条消息,消息内容为:执行发送方消息后的结果。

其中,接收方每次发送消息后,都会调用flush方法。因此,我作为接收方,使用了两次read方法来读取消息。

紧接着,bug就产生了。但这个bug不是总是出现,而是偶尔出现。后来在debug的过程中发现。原来我第一个read方法,读到回复的消息并不一定是接收方回复的“消息是否发送成功”这一条,时长也会读到接收方回复的两条消息:包括“消息是否发送成功”和“执行结果”。因此,我第二个read方法,再去读管道中已经没有消息了,因此,线程一直处于等待接受消息的挂起状态。

后来,在看官方的api的过程中发现flush方法大致描述如下:flush方法会将缓存中的数据立即强制刷新,而这些被强制刷新的数据会交给操作系统,至于操作系统什么时候讲这些输入写到管道中,这并不是我们能控制的。

因此,在我的项目中,虽然接收方每次都调用flush方法,但不保证这个消息立即被发送给发送方,什么时候发送给发送方是由操作系统决定的。因此,这个bug并不总是出现。

后来,我作为发送方在第一次read的时候,加入了接受到的消息数目判断,解决了这个bug。