java - 异步关闭套接字 channel

标签 java asynchronous nio

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

当我完成对连接的写入后,我想关闭它。

channel 的关闭是否意味着阻塞,直到所有缓冲的写入都被接收者确认?

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

有没有办法配置这个,例如与 setSoLinger() (什么样的设置才合适?)

(在这方面对 Linux 和其他操作系统进行超越 Java 的一般性讨论将很有用)

最佳答案

以非阻塞方式关闭是非阻塞的。

您可以将 channel 置于阻塞模式,设置一个正的逗留超时,然后关闭,这将在套接字发送缓冲区被清空时阻塞直到逗留超时,但是可惜 Java 不会抛出异常,如果linger timeout 到期,所以你无法知道是否所有的数据都已经消失了。我在十年或更多年前报告了这个错误,但由于兼容性问题,它又“无法修复”。如果你能等到 Java 7 出来,我相信 nio2 的东西已经修复了,我当然要求它,但谁知道那会是什么时候?

即使您拥有所有这些,您所知道的也只是数据已发送。您对接收方应用程序正在接收或处理它一无所知。如果您需要,则必须将其构建到您的应用程序协议(protocol)中。

关于java - 异步关闭套接字 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021532/

相关文章:

c++ - boost 等效于 std::async()

java - 变量引用不存在的资源 Build.xml

java - Resteasy 返回 403 未在 junit 中处理

iOS:在填充 TableView 之前等待异步方法

matlab - 使用Matlab在后台异步调用系统函数

java - 在多线程环境中限制连接组的速率

java - 使用 FileLock 将行追加到文件

java - 路径对象是否抽象?

java - 解决 IVY ANT 的 Oracle JDBC 依赖性

Java:获取JPEG DCT系数直方图