如何在Java NIO中刷新SocketChannel?

问题描述 投票:0回答:3

在Java IO中,

OutputStream
可以使用
flush()
方法来确保数据立即发送。

Java NIO 中是否有对应的函数

SocketChannel
?据我所知,有一个用于
force()
刷新数据的
FileChannel
方法。

可能是一个非常天真的问题...

java nio
3个回答
12
投票

OutputStream.flush()
除了刷新堆栈中任何
BufferedOutputStream
ObjectOutputStream
PrintStream
的缓冲区之外,不执行任何操作。

具体来说,它不会执行与

FileChannel.force()
getFD().sync()
对应的任何操作。它只是将流缓冲区从 JVM 刷新到(在本例中)内核中的套接字发送缓冲区。

SocketChannel.write()
根本不涉及任何此类缓冲:它直接进入内核中的套接字发送缓冲区。所以没有什么可以flush的,所以没有flush操作。


4
投票

当您将数据强制写入磁盘时,操作系统可以确定数据已成功写入磁盘。然而,TCP 通信更加复杂,并且数据要经过操作系统控制之外的许多阶段。一般来说,操作系统会尽快结束数据,并且不会将套接字数据(通常约为 64 KB)缓冲到缓冲磁盘写入(有时是 GB)的程度

确保数据已成功接收的最佳方法是让另一端发送响应。

如果您希望尽可能快地发送数据,您可以尝试关闭 nagle,但是大多数操作系统都非常聪明地对此进行优化,并且关闭它并不会像使用它时那样产生太大的差异。


0
投票

使用

.force()
.getFD.sync()

更新:由于您更新了您的问题,使其在 SocketChannel 上更加具体(通常是 NIO),请参阅我的回复。

© www.soinside.com 2019 - 2024. All rights reserved.