我的服务器使用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)。