AsynchronousSocketChannel

AsynchronousSocketChannel

我的服务器使用AsynchronousServerSocketChannel,它使用CompletionHandler监听客户端连接。接受客户端连接后,将读取AsynchronousSocketChannel,再次使用CompletionHandler接收数据而不会超时。

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

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

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

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)。

10-06 05:37