你如何干净地关闭AsynchronousSocketChannel?

时间:2013-12-23 15:04:53

标签: java nio nio2

我的服务器使用AsynchronousServerSocketChannel使用CompletionHandler侦听客户端连接。接受客户端连接后,将再次使用AsynchronousSocketChannel读取CompletionHandler以接收没有超时的数据。

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

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

我原本希望客户端上的AsynchronousSocketChannel.close()调用转换为服务器上读取长度为CompletionHandler.completed的{​​{1}},表明套接字已关闭,但是回调是-1,但有以下异常:

CompletionHandler.failed

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

1 个答案:

答案 0 :(得分:1)

documentation on close表示它会导致 另一方面是AsynchronousCloseException或ClosedChannelException。

要导致completed(-1),客户应拨打shutdownInput

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