인터럽트로 "종료"할 수 있도록 코드를 디자인하려고합니다. 주로, 이는 Java 동시성 패키지의 Executor
프레임 워크가 interrupt
을 사용하여 실행중인 작업을 취소하기 때문입니다. 또한 "종료"작업은 종료되는 작업의 내부를 알 필요가 없습니다.
그러나, 인터럽트를 무시하는 ServerSocket
생성자로 생성 한 서버 created from a ServerSocketChannel
.입니다 하지 않는 accept
에 대한 호출이 인터럽트에 응답하지 않습니다, 나는이를 다시 구성하는 방법을 발견하지 않았습니다.
서버를 만드는 코드를 변경할 수없는 경우 서버 소켓에서 close
을 호출하는 다른 스레드를 준비하십시오. 또한 서버 소켓을 만드는 데 사용 된 방법에 관계없이 accept
에 차단 된 스레드에서 예외가 발생합니다.
이렇게하면 SSL을 사용할 때 큰 어려움이 있습니다. JSSE 소켓은 InterruptibleChannel
에서 생성되지 않으며 스레드의 간단한 인터럽트에 응답하지 않습니다.
클라이언트에게 알리지 않고 서버를 닫을 수 없다는 메시지가 나타났습니다. 소켓을 성공적으로 중단하면 종료됩니다.
accept
(으)로 전화를 걸면 서버 소켓이 수락 상태로 차단 된 경우 클라이언트가 연결되지 않으므로 문제가되지 않습니다. 현재 연결을 나타내는 Socket
인스턴스의 경우에만 문제가되어야합니다.
알림 요구 사항을 충족하지 못하는 경우 NIO의 ServerSocketChannel
을 비 차단 모드로 사용하기위한 재 작업이 필요할 수 있습니다.
음 좋은 대답 .. 어쩌면 내가 문제에 접근 방식을 변경합니다. 클라이언트 측에서 try-catch로 서버 종료를 관리합니다. –