java - 如何干净利落地关闭 AsynchronousSocketChannel?

标签 java nio nio2

我的服务器使用 AsynchronousServerSocketChannel,它使用 CompletionHandler 监听客户端连接。当客户端连接被接受时,AsynchronousSocketChannel 被读取,再次使用 CompletionHandler 接收没有超时的数据。

到目前为止一切顺利,我的客户端连接,写入服务器读取的数据,服务器能够通过相同的套接字响应将数据发送回客户端。

当我的客户端终止时,它调用 AsynchronousSocketChannel.close() 来关闭套接字。进行此调用时,服务器正在等待从套接字读取数据。

我曾预计在客户端调用 AsynchronousSocketChannel.close() 会转换为对读取长度为 -1 的 CompletionHandler.completed 的回调 在服务器上,表明套接字已关闭,但回调是 CompletionHandler.failed,但有以下异常:

java.io.IOException: The specified network name is no longer available.
  at sun.nio.ch.Iocp.translateErrorToIOException(Iocp.java:309)
  at sun.nio.ch.Iocp.access$700(Iocp.java:46)
  at sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:399)
  at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:744)    

客户端应该如何关闭套接字,以免在服务器上被视为错误?

最佳答案

documentation on close说它导致 另一端的 AsynchronousCloseException 或 ClosedChannelException。

要导致 completed(-1),客户端应该调用 shutdownInput .

但是,我会将 AsynchronousCloseException 和 ClosedChannelException 与 completed(-1) 一起视为正常关闭。

关于java - 如何干净利落地关闭 AsynchronousSocketChannel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20746091/

相关文章:

Java 将字符串和 string[] 传递给另一个类

java - Cassandra-unit : java. io.IOException:连接被对等方重置

UnixFileSystem 的 Java File.renameTo() 实现

java - 如何使用 Java NIO 2 访问 jar 存档中的 zip 文件

java - 在 Java 6 中使用 Java 7 SDK 功能

java - Java NIO 2 中的多线程模型 - (前摄器模式)是什么?

java - HIBERNATE:如何使用带有逗号分隔内容的 varchar 列作为实体中的列表

java - 如何测试 java NIO 静态方法?

java - 使用java nio的部分消息问题

java - 如何在 C++ 或 C# 或 Java 中创建 jpegs(live) 流?实时传输协议(protocol)?