2011-09-21 5 views
2

Java에서 기본 서버 - 클라이언트 프로그램을 작성 중이며 클라이언트가 예기치 않게 종료되는 경우를 처리하려고합니다.소켓 닫히지 않음 IOException

public void run() { 
    while(alive) { 
     try { 
      // socketIn is a BufferedReader wrapped around the socket's InputStream. 
      String input = socketIn.readLine(); 
      if(input == null) 
       continue; 
      String response = processInput(input); 
      // socketOut is a PrintWriter wrapped around the socket's OutputStream. 
      if(response != null) { 
       socketOut.println(response); 
       socketOut.flush(); 
      } 
     } catch(IOException e) { 
      System.out.println("TRACE 1"); 
      alive = false; 
     } 
    } 
    System.out.println("TRACE 2"); 
} 

그러나 클라이언트를 죽이면 루프가 계속 진행되고 TRACE가 인쇄되지 않습니다. 소켓이 다른 쪽 끝에서 닫히고 소켓에서 읽으려고하면 IOException이 발생합니다.

이것은 잘못된 가정입니까? 이 문제를 해결하려면 어떻게해야합니까?

+1

연결 시간 초과를 고려하고 SocketExceptions도 고려하십시오. – Zaki

+0

연결 시간 초과는 좋은 생각이며 SocketException은 IOException의 하위 클래스라고 생각합니다. – DanielGibbs

답변

4

readLine()은 스트림 끝 부분에서 null을 반환합니다. 이는 원격 장치가 연결을 정상적으로 닫을 때 발생합니다. 이 조건에서 continue을 (를) 시도하면 영구히 반복됩니다. 연결이 비정상적으로 중단되면 IOException이 발생합니다.

+0

우리는 보통 다음과 같이 원격 소켓에서 읽습니다 : String msg = null; while ((msg = s.readLine())! = null) {// 메시지를 읽습니다.}} // 소켓이 원격 끝에서 닫혔습니다. –

관련 문제