2011-09-16 36 views

回答

1

二者必选其一.force().getFD.sync()

更新:既然你更新你的问题是在一个SocketChannel更具体的(这是一般NIO),请看到我的反而应该。

+1

是的。但是,这是FileChannel,对吧?我需要SocketChannel的相同功能。 – DeepNightTwo

+0

SocketChannel不能被刷新。您必须检查数据是否完全发送。 – datalost

+0

谢谢。这也是帮助:)。顺便说一下,你会请推荐一些链接或书籍来了解Java NIO。再次感谢! – DeepNightTwo

4

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

确保数据已成功接收是为了让另一端发送响应。

如果您希望尽可能快地发送数据,您可以尝试关闭nagle,但是大多数操作系统在优化此操作方面非常聪明,关闭操作与使用时没有太大差别。

+0

感谢您的详细信息! – DeepNightTwo

7

OutputStream.flush()什么都不做,除了冲刷堆栈中的任何BufferedOutputStream s或ObjectOutputStream s或PrintStream的缓冲区。

具体而言,它不会执行任何与FileChannel.force()getFD().sync()相对应的操作。它只是将来自JVM的流缓冲区刷入(在本例中)内核中的套接字发送缓冲区。

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

+0

谢谢!了解更多关于NIO的信息:-) – DeepNightTwo