异步关闭套接字通道

时间:2010-10-26 07:27:54

标签: java asynchronous nio

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

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

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

知道,当异步关闭时,它是否成功将是有用的,但我可以接受被忽略的任何错误。

有没有办法配置这个,例如使用setSoLinger()(以及适当的设置?)

(关于Linux和其他操作系统在这方面的Java之外的一般性讨论将是有用的)

2 个答案:

答案 0 :(得分:3)

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

您可以将通道设置为阻塞模式,设置肯定的延迟超时和关闭,这将阻止套接字发送缓冲区被清空时的延迟超时,但是如果Java没有抛出异常,延迟超时到期,因此您无法知道所有数据是否已经消失。我在十年或更久以前报告了这个错误,由于兼容性的考虑,它回来了“不会修复”。如果你可以等到Java 7出来我相信nio2的东西已经修复了,我当然要求它,但是谁知道什么时候会这样呢?

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

答案 1 :(得分:1)

我不确定到底发生了什么,但我知道close()包含flush()PrintStreamPrintWriter除外)。

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

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