AsynchronousServerSocketChannel을 만들고 서버 소켓 소켓을 닫을 때까지는 아무 문제가 없습니다. 서버 및 모든 소켓 채널을 닫는 함수를 호출하는 특수 메시지를 사용하여 클라이언트에서 AsynchronousSocketChannel을 만듭니다. 서버가 닫혀 있지만 finnally 블록이 실행되지 않습니다. 이유가 무엇입니까?AsynchronousServerSocketChannel finally 블록이 실행되지 않았습니다.
확인 코드 :
public void openServerSocket(int sport) {
port = sport;
policyFile = createPolicy(new String[]{"*:"+port});
try {
//group = AsynchronousChannelGroup.withThreadPool(Executors.newSingleThreadExecutor());
//group.awaitTermination(1, TimeUnit.SECONDS);
server = AsynchronousServerSocketChannel.open();
server.bind(new InetSocketAddress(sport));
server.accept(null, this);
while(isOpen) {
//System.out.println("running server socket");
}
}catch(Exception ex) {
this.message = ex.getMessage();
System.out.println("Server: " + ex.getMessage());
}finally {
System.out.println("Finall serversocket closing!");
for(SocketHandler sh : sockets) {
sh.close();
}
if(server != null) {
try {
server.close();
server = null;
}catch(Exception ex2) {
this.message = ex2.getMessage();
}
}
sockets.clear();
sockets = null;
//this.message = "server socket closed";
System.out.println("server socket down");
}
}
@Override
public void completed(AsynchronousSocketChannel socket, Void attachment) {
System.out.println("new connection");
SocketHandler sh = new SocketHandler(socket, this);
server.accept(null, this);
}
@Override
public void failed(Throwable exc, Void attachment) {
System.out.println("Server Failed accept:" + exc.getMessage());
}
public void closeServerSocket() {
System.out.println("Closing server socket! " + server);
this.isOpen = false;
}
그래서 기능 closeServerSocket가 호출 내가 루프 유지 변수 ISOPEN false로 설정,하지만 난 ISOPEN var에 false로 설정하면 여전히 반복되는 동안 보인다 마지막으로 실행되지 않습니다입니까?
'isOpen'은'false'로 변경됩니까? – JonK
네, 변경되었지만 루프에 아무런 영향을주지 않습니다. 이유 : ( – user2803095
'isOpen' 선언과 그 위치가 바뀔 수 있습니까? – JonK