我有一个使用 nio 用 Java 编写的单线程非阻塞套接字 IO 服务器。
当我完成对连接的写入后,我想关闭它。
channel 的关闭是否意味着阻塞,直到所有缓冲的写入都被接收者确认?
了解异步关闭时是否成功会很有用,但我可以忍受忽略关闭过程中的任何错误。
有没有办法配置这个,例如与 setSoLinger()
(什么样的设置才合适?)
(在这方面对 Linux 和其他操作系统进行超越 Java 的一般性讨论将很有用)
最佳答案
以非阻塞方式关闭是非阻塞的。
您可以将 channel 置于阻塞模式,设置一个正的逗留超时,然后关闭,这将在套接字发送缓冲区被清空时阻塞直到逗留超时,但是可惜 Java 不会抛出异常,如果linger timeout 到期,所以你无法知道是否所有的数据都已经消失了。我在十年或更多年前报告了这个错误,但由于兼容性问题,它又“无法修复”。如果你能等到 Java 7 出来,我相信 nio2 的东西已经修复了,我当然要求它,但谁知道那会是什么时候?
即使您拥有所有这些,您所知道的也只是数据已发送。您对接收方应用程序正在接收或处理它一无所知。如果您需要,则必须将其构建到您的应用程序协议(protocol)中。
关于java - 异步关闭套接字 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021532/