2010-10-26 109 views
4

我有一个使用nio在Java中编写的单线程无阻塞套接字IO服务器。异步关闭套接字通道

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

通道关闭是否意味着阻止,直到接收方已确认所有缓冲的写入操作为止?

这将是有益的知道,当异步关闭,它成功与否,但我可以在关闭任何错误住被忽略。

有没有什么办法来配置它,例如与setSoLinger()(什么设置比较合适?)

(在这方面超越Java关于Linux和其它操作系统的一般性讨论将是有益的)

回答

3

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

你可以把通道设置为阻塞模式,设置一个积极的逗留超时并关闭,当套接字发送缓冲区被清空时,这会阻塞直到超时超时,但是,Java不会抛出异常如果延迟超时过期,那么您无法知道所有数据是否已经消失。我在十年前报告了这个错误,并且由于兼容性问题,它返回'不能修复'。如果你可以等到Java 7出来,我相信nio2的东西有这个固定的,我当然要求它,但谁知道什么时候会这样?

即使你有这一切,你知道的只是数据被发送。您不知道收件人应用程序收到或处理的任何内容。如果你需要,你必须建立它到你的应用程序协议。

+1

非常感谢您对我的理解,我一直在寻找的确认! – Will 2010-10-29 05:24:27

1

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

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

据我所知,你的服务器是单线程的,但第二个线程没有花费那么多的问题的复杂性低,解决方案将是很容易理解的任何维护。

+0

单线程单线程单线程 – Schildmeijer 2010-10-26 07:37:47

+0

@Schildmeijer:现实总是胜过规则。 – 2010-10-26 07:54:51

+1

近距离的冲水似乎与传统的IO流相似;但是渠道也是如此吗? – Will 2010-10-26 18:46:01