私のサーバーは、を使用AsynchronousServerSocketChannel
してクライアント接続をリッスンする を使用しCompletionHandler
ます。クライアント接続が受け入れられると、AsynchronousSocketChannel
が読み取られ、再び を使用してCompletionHandler
タイムアウトなしでデータを受信します。
これまでのところ、クライアントは接続し、サーバーによって読み取られるデータを書き込みます。サーバーは、同じソケットを介してクライアントにデータを送信することに応答できます。
クライアントが終了すると、 を呼び出し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)
サーバー上でエラーと見なされないように、クライアントはどのようにソケットを閉じる必要がありますか?