在Java IO中,
OutputStream
可以使用flush()
方法来确保数据立即发送。
SocketChannel
?据我所知,有一个用于 force()
刷新数据的 FileChannel
方法。
可能是一个非常天真的问题...
OutputStream.flush()
除了刷新堆栈中任何 BufferedOutputStream
或 ObjectOutputStream
或 PrintStream
的缓冲区之外,不执行任何操作。
具体来说,它不会执行与
FileChannel.force()
或 getFD().sync()
对应的任何操作。它只是将流缓冲区从 JVM 刷新到(在本例中)内核中的套接字发送缓冲区。
SocketChannel.write()
根本不涉及任何此类缓冲:它直接进入内核中的套接字发送缓冲区。所以没有什么可以flush的,所以没有flush操作。
当您将数据强制写入磁盘时,操作系统可以确定数据已成功写入磁盘。然而,TCP 通信更加复杂,并且数据要经过操作系统控制之外的许多阶段。一般来说,操作系统会尽快结束数据,并且不会将套接字数据(通常约为 64 KB)缓冲到缓冲磁盘写入(有时是 GB)的程度
确保数据已成功接收的最佳方法是让另一端发送响应。
如果您希望尽可能快地发送数据,您可以尝试关闭 nagle,但是大多数操作系统都非常聪明地对此进行优化,并且关闭它并不会像使用它时那样产生太大的差异。
使用
.force()
或 .getFD.sync()
更新:由于您更新了您的问题,使其在 SocketChannel 上更加具体(通常是 NIO),请参阅我的回复。