내 서버는 클라이언트 연결을 청취하는 AsynchronousServerSocketChannel
을 사용하여 CompletionHandler
을 사용합니다. 클라이언트 연결이 승인되면 CompletionHandler
을 사용하여 다시 시간 초과없이 데이터를 수신하여 AsynchronousSocketChannel
을 읽습니다.어떻게 AsynchronousSocketChannel을 완전히 닫습니까?
내 클라이언트가 연결하면 서버에서 읽은 데이터를 쓰고, 데이터를 동일한 소켓을 통해 클라이언트에 다시 응답 할 수 있습니다.
내 클라이언트가 종료되면 AsynchronousSocketChannel.close()
을 호출하여 소켓을 닫습니다. 이 호출이 이루어지면 서버는 소켓에서 데이터를 읽으려고 기다리고 있습니다.
-1
의 읽기 길이
CompletionHandler.completed
에 콜백으로 번역하는 클라이언트
AsynchronousSocketChannel.close()
에 대한 호출을 기대했던
이 닫혀 있었다 그러나 콜백은 다음을 제외하고 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)
서버에서 오류로 보이지 않도록 클라이언트가 소켓을 닫아야합니까?
'반대편'에 대해서는 아무 말도하지 않습니다. 두 예외는 모두 '정상 종료'가 아니라 프로그래밍 오류로 처리되어야합니다. – EJP
클라이언트 측에서'AsynchronousSocketChannel.shutdownInput'에 대한 호출에 추가했습니다. 실제로 서버에서 읽기 길이가 -1 인 'CompletionHandler.completed' 콜백이 발생합니다. –
적어도 클라이언트 측에서 매우 일반적인 IOException이 아니지만 클라이언트 측에서 close를 시작했기 때문에 클라이언트 측에서 AsynchronousCloseException을 얻는 것은 유감 스럽지만이 오류를 무시하기 위해'closing' 플래그를 추가 할 수 있습니다. –