我有一个使用nio在Java中编写的单线程无阻塞套接字IO服务器。异步关闭套接字通道
当我写完连接后,我想关闭它。
通道关闭是否意味着阻止,直到接收方已确认所有缓冲的写入操作为止?
这将是有益的知道,当异步关闭,它成功与否,但我可以在关闭任何错误住被忽略。
有没有什么办法来配置它,例如与setSoLinger()
(什么设置比较合适?)
(在这方面超越Java关于Linux和其它操作系统的一般性讨论将是有益的)
我有一个使用nio在Java中编写的单线程无阻塞套接字IO服务器。异步关闭套接字通道
当我写完连接后,我想关闭它。
通道关闭是否意味着阻止,直到接收方已确认所有缓冲的写入操作为止?
这将是有益的知道,当异步关闭,它成功与否,但我可以在关闭任何错误住被忽略。
有没有什么办法来配置它,例如与setSoLinger()
(什么设置比较合适?)
(在这方面超越Java关于Linux和其它操作系统的一般性讨论将是有益的)
在非阻塞模式下关闭是非阻塞的。
你可以把通道设置为阻塞模式,设置一个积极的逗留超时并关闭,当套接字发送缓冲区被清空时,这会阻塞直到超时超时,但是,Java不会抛出异常如果延迟超时过期,那么您无法知道所有数据是否已经消失。我在十年前报告了这个错误,并且由于兼容性问题,它返回'不能修复'。如果你可以等到Java 7出来,我相信nio2的东西有这个固定的,我当然要求它,但谁知道什么时候会这样?
即使你有这一切,你知道的只是数据被发送。您不知道收件人应用程序收到或处理的任何内容。如果你需要,你必须建立它到你的应用程序协议。
我不知道到底发生了什么,但我知道, close()
包括flush()
(PrintStream
和PrintWriter
...除外)。
所以,我的方法是添加连接,关闭该队列在第二个线程(包括错误处理)队列和处理。
据我所知,你的服务器是单线程的,但第二个线程没有花费那么多的问题的复杂性低,解决方案将是很容易理解的任何维护。
单线程单线程单线程 – Schildmeijer 2010-10-26 07:37:47
@Schildmeijer:现实总是胜过规则。 – 2010-10-26 07:54:51
近距离的冲水似乎与传统的IO流相似;但是渠道也是如此吗? – Will 2010-10-26 18:46:01
非常感谢您对我的理解,我一直在寻找的确认! – Will 2010-10-29 05:24:27