2013-12-23 3 views
8

내 서버는 클라이언트 연결을 청취하는 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)  

서버에서 오류로 보이지 않도록 클라이언트가 소켓을 닫아야합니까?

답변

1

documentation on close은 반대쪽에서 AsynchronousCloseException 또는 ClosedChannelException이 발생한다고 말합니다.

completed(-1)으로 인해 클라이언트가 shutdownInput으로 전화해야합니다.

그러나 정상 종료와 함께 AsynchronousCloseException 및 ClosedChannelException을 완료 (-1)로 처리합니다.

+1

'반대편'에 대해서는 아무 말도하지 않습니다. 두 예외는 모두 '정상 종료'가 아니라 프로그래밍 오류로 처리되어야합니다. – EJP

+0

클라이언트 측에서'AsynchronousSocketChannel.shutdownInput'에 대한 호출에 추가했습니다. 실제로 서버에서 읽기 길이가 -1 인 'CompletionHandler.completed' 콜백이 발생합니다. –

+0

적어도 클라이언트 측에서 매우 일반적인 IOException이 아니지만 클라이언트 측에서 close를 시작했기 때문에 클라이언트 측에서 AsynchronousCloseException을 얻는 것은 유감 스럽지만이 오류를 무시하기 위해'closing' 플래그를 추가 할 수 있습니다. –

관련 문제