2013-11-21 2 views
1

KnockKnock 서버 예제를 통해 http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html으로 읽었으며 몇 가지 질문이 있습니다.자원 봉사 및 서버 소켓

try (ServerSocket serverSocket = new ServerSocket(portNumber)) { 
    while (listening) { 
     new KKMultiServerThread(serverSocket.accept()).start(); 
    } 
} catch (IOException e) { 
    System.err.println("Could not listen on port " + portNumber); 
    System.exit(-1); 
} 

내 질문 :

  1. serverSocket의 범위는 무엇입니까? 잡힌 예외 블록이나 주변 블록의 다른 곳에서 사용할 수 있습니까? 그렇지 않다면 소켓을 어떻게 안정적으로 닫을 수 있습니까?
  2. 이 인스턴스에서 소켓은 어떻게 닫습니까? 이 샘플이 실행을 멈출 수있는 유일한 방법은 프로세스를 강제 종료하는 것이지만이 시점 이후에 열린 소켓은 어떻게됩니까? 사용중인 포트가 다른 응용 프로그램 (또는 동일한 응용 프로그램)에서 더 이상 사용 가능하지 않습니까?
  3. new KKMultiServerThread은 어떻게됩니까? 스레드가 작업을 완료하면이 스레드는 가비지 수집기에서 정리됩니까?
+0

서버 소켓이 소멸자에서 닫히고 스레드가 '중지'됩니다. –

+0

여기에 'serverSocket' 변수의 범위가 설명되어 있습니다. http://stackoverflow.com/questions/18691352/try-with-resources-scope-of-resource – FGreg

+2

@JeroenBollen Java에는 소멸자가 없습니다. – EJP

답변

1
    당신은 ServerSocket의를 닫을 필요가 없습니다
  1. 이는 시도 (자원)/캐치 관용구를 위해 발명 된 것입니다. 결국 자원이 제대로 닫히고 해제됩니다. 해당 리소스는 소위 AutoCloseable입니다.

  2. Java에서 예약 된 모든 메모리와 마찬가지로, 더 이상 사용되지 않으면 GC에 의해 결국 정리됩니다. 그러나이 스레드의 run() 메서드가 완료된 경우에만 발생할 수 있습니다. 또한 나머지 모든 스레드가 데몬 스레드 인 경우에만 JVM이 종료되므로 해당 KKMultiServerThreads가 표준 (비 데몬) 스레드 인 경우 적어도 모든 스레드가 완료 될 때까지 위의 루프가 완료된 후에도 JVM이 지속될 수 있습니다.

그들은 상기 루프를 종료하는 방법을 정정 listening false로 설정하고 수용 interrupt() 스레드를 호출한다. 이 경우 accept() 메서드가 반환되고 즉시 예외 처리로 이동 한 다음 try (resource)/catch (try/catch/finally close()와 유사)를 사용하면 서버가 제대로 닫힙니다. 이렇게하면 다른 프로그램에서 사용중인 포트가 해제됩니다.