Java 异步关闭套接字通道

Java 异步关闭套接字通道,java,asynchronous,nio,Java,Asynchronous,Nio,我有一个使用nio用Java编写的单线程非阻塞套接字IO服务器 当我写完一个连接后,我想关闭它 通道关闭是否意味着在收件人确认所有缓冲写入之前阻止 知道异步关闭时是否成功是很有用的,但我可以忍受关闭过程中的任何错误被忽略 是否有办法对此进行配置,例如使用(以及什么设置才合适?) (关于Linux和其他操作系统的Java之外的一般性讨论将有助于)我不确定到底发生了什么,但我知道close()包括flush()(在PrintStream和PrintWriter中除外) 因此,我的方法是添加接近队列的

我有一个使用nio用Java编写的单线程非阻塞套接字IO服务器

当我写完一个连接后,我想关闭它

通道关闭是否意味着在收件人确认所有缓冲写入之前阻止

知道异步关闭时是否成功是很有用的,但我可以忍受关闭过程中的任何错误被忽略

是否有办法对此进行配置,例如使用(以及什么设置才合适?)


(关于Linux和其他操作系统的Java之外的一般性讨论将有助于)

我不确定到底发生了什么,但我知道
close()
包括
flush()
(在
PrintStream
PrintWriter
中除外)

因此,我的方法是添加接近队列的连接,并在第二个线程中处理该队列(包括错误处理)


我知道您的服务器是单线程的,但第二个线程的成本并不高,问题的复杂性很低,并且解决方案很容易理解和维护。

在非阻塞模式下关闭是非阻塞的

您可以将通道置于阻塞模式,设置一个正的延迟超时,然后关闭,这将在套接字发送缓冲区清空时阻塞到延迟超时,但遗憾的是,如果延迟超时过期,Java不会抛出异常,因此您无法知道是否所有数据都已丢失。我在十年或更多年前报告了这个bug,但出于兼容性考虑,它回来后“不会修复”。如果您可以等到Java7问世,我相信nio2的东西已经解决了这个问题,我当然要求它,但谁知道什么时候会这样呢


即使你拥有所有这些,你所知道的只是数据是被发送的。您不知道收件人应用程序正在接收或处理它。如果您需要,您必须将其构建到您的应用程序协议中。

@Schildmeijer:现实总是胜于规则;但频道也是这样吗?@Will:要么写一个测试来确定答案,要么假设最坏的结果。这都是无关紧要的。他说的是非阻塞I/O,这意味着java.nio,其中没有flush(),因此没有什么可测试的;而flush()与接收者首先确认缓冲数据无关。谢谢,非常感谢您确认我所寻找的理解!