我的服务器使用AsynchronousServerSocketChannel
. 监听客户端连接CompletionHandler
。当一个客户端连接被接受时,它AsynchronousSocketChannel
被读取,再次使用 aCompletionHandler
来接收没有超时的数据。
到目前为止一切顺利,我的客户端连接,写入服务器读取的数据,服务器能够响应通过同一个套接字将数据发送回客户端。
当我的客户端终止时,它会调用AsynchronousSocketChannel.close()
, 来关闭套接字。当进行此调用时,服务器正在等待从套接字读取数据。
我曾期望AsynchronousSocketChannel.close()
客户端上的调用转换为服务器上CompletionHandler.completed
读取长度为的回调-1
,表明套接字已关闭,但是回调是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)
客户端应该如何关闭一个套接字,以便它在服务器上不被视为错误?