在Java IO中,OutputStream
可以使用flush()
方法确保数据一次发送。如何在Java NIO中刷新SocketChannel?
在Java NIO中是否有对应SocketChannel
的函数?据我所知,FileChannel
有一个force()
方法来刷新数据。
可能是一个很幼稚的问题...
在Java IO中,OutputStream
可以使用flush()
方法确保数据一次发送。如何在Java NIO中刷新SocketChannel?
在Java NIO中是否有对应SocketChannel
的函数?据我所知,FileChannel
有一个force()
方法来刷新数据。
可能是一个很幼稚的问题...
二者必选其一.force()
或.getFD.sync()
更新:既然你更新你的问题是在一个SocketChannel更具体的(这是一般NIO),请看到我的反而应该。
将数据强制()到磁盘时,操作系统可以确定它已成功写入磁盘。但是,TCP通信更复杂,数据通过操作系统控制之外的许多阶段。一般来说,操作系统会尽快结束数据,并且不会缓冲套接字数据(通常大约64 KB)到缓冲磁盘写入的程度(有时为GB)
确保数据已成功接收是为了让另一端发送响应。
如果您希望尽可能快地发送数据,您可以尝试关闭nagle,但是大多数操作系统在优化此操作方面非常聪明,关闭操作与使用时没有太大差别。
感谢您的详细信息! – DeepNightTwo
OutputStream.flush()
什么都不做,除了冲刷堆栈中的任何BufferedOutputStream
s或ObjectOutputStream
s或PrintStream
的缓冲区。
具体而言,它不会执行任何与FileChannel.force()
或getFD().sync()
相对应的操作。它只是将来自JVM的流缓冲区刷入(在本例中)内核中的套接字发送缓冲区。
SocketChannel.write()
根本不涉及任何这样的缓冲:它直接进入内核中的套接字发送缓冲区。所以没有什么可刷新的,所以没有刷新操作。
谢谢!了解更多关于NIO的信息:-) – DeepNightTwo
是的。但是,这是FileChannel,对吧?我需要SocketChannel的相同功能。 – DeepNightTwo
SocketChannel不能被刷新。您必须检查数据是否完全发送。 – datalost
谢谢。这也是帮助:)。顺便说一下,你会请推荐一些链接或书籍来了解Java NIO。再次感谢! – DeepNightTwo