11

私のサーバーは、を使用AsynchronousServerSocketChannelしてクライアント接続をリッスンする を使用しCompletionHandlerます。クライアント接続が受け入れられると、AsynchronousSocketChannelが読み取られ、再び を使用してCompletionHandlerタイムアウトなしでデータを受信します。

これまでのところ、クライアントは接続し、サーバーによって読み取られるデータを書き込みます。サーバーは、同じソケットを介してクライアントにデータを送信することに応答できます。

クライアントが終了すると、 を呼び出しAsynchronousSocketChannel.close()てソケットを閉じます。この呼び出しが行われると、サーバーはソケットからのデータの読み取りを待機しています。

クライアントでの への呼び出しが、ソケットが閉じられたことを示すサーバーでの読み取り長のAsynchronousSocketChannel.close()へのコールバックに変換されることを期待していましたが、コールバックには次の例外があります。CompletionHandler.completed-1CompletionHandler.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

クローズに関するドキュメントには、反対側で AsynchronousCloseException または ClosedChannelException が発生すると書かれています。

クライアントがshutdownInputcompleted(-1)を呼び出す必要があります。

ただし、AsynchronousCloseException と ClosedChannelException は、completed(-1) と共に通常のシャットダウンとして扱います。

于 2013-12-23T19:05:26.720 に答える