11

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

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

4

1 回答 1

3

close 上的文档说它会导致 AsynchronousCloseException 或 ClosedChannelException 在另一边。

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

但是,我会将 AsynchronousCloseException 和 ClosedChannelException 以及完成(-1)视为正常关闭。

于 2013-12-23T19:05:26.720 回答