2012-05-04 5 views
0

텔넷 클라이언트 연결이 끊어지면 IOException이 발생하지 않는 문제가 있습니다. 텔넷 종료시 BufferedReader 또는 Socket이 예외를 throw하지 않습니다.

나는 다음과 같은 소스에서 서버 코드를 사용 : 주어진 코드에서

http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/Code/SocketThrdServer.java

, 서버가 종료하고 "실패 읽기"때 클라이언트 가까이를 표시해야합니다. 하지만 텔넷이나 퍼티 (RAW 연결)에서는 그렇지 않습니다. 반대로, 예제 클라이언트를 사용할 때 작동합니다. 완벽하게 작동합니다.

또한 readLine()이 I/O를 항상 차단하지 않고 시간 제한을 사용하도록 코드를 수정 해 보았습니다. 그러나 클라이언트 연결이 끊어 졌는지 여부를 감지하는 데 도움이되지는 않는 것 같습니다.

while (true) { 
     try { 
      client.setSoTimeout(1000); 
      line = in.readLine(); 
      // Send data back to client 
      out.println(line); 
      textArea.append(line); 

     } catch (SocketTimeoutException ex) { 
      if(client.isClosed()) { 
       System.out.println("Client disconnected"); 
       System.exit(-1); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println("Read failed"); 
      System.exit(-1); 
     } 
    } 

텔넷이나 Raw Connection을 사용할 때 누락되는 것이 있습니까?

편집 : 나는 2 클라이언트를 실행하고 나는 첫 번째 클라이언트를 닫을 때 정상 종료의 경우 그 외에도,이 경우,

답변

1

...의 BufferedReader에서 던진 예외가 없을 것 입출력 예외가 있어서는 안된다. in.readLine();은이 경우 코드가 처리해야하는 경우 null을 반환해야합니다.

+0

오케이, 나는 그 이유에 대한 대답을 추측합니다. 그러나, 나는 정상 종료가 소켓 상태를 닫히지 않는 이유는 무엇인지 궁금하다. 이것은 소켓이 여전히 닫히지 않는다고 생각하기 때문에 isClosed()를 비효율적으로 만든다. –

+0

글쎄, 정확히 isClosed() signifys를 모르지만 TCP 연결은 * 양쪽 끝이 연결을 닫을 때만 닫힌다. 끝은 그것을 다시 놓았다, TCP RST를 보냈다). TCP 연결은 한쪽 끝이 쓰기 방향을 닫았지만 다른 쪽 끝은 여전히 ​​데이터를 보낼 수있는 반이중 상태 일 수 있습니다. – nos

+0

@Seeyabye TCP에 '다이얼 톤'이 없으므로 한 쪽 소켓이 다른 쪽 소켓이 연결에서 I/O를 시도하는 것 이외의 다른 것을 닫았다는 것을 알 수있는 방법이 없습니다. 'isClosed()'와 친구들은 당신이 자신의 소켓에 무엇을했는지를 알려주지 만 연결에 어떤 일이 일어 났는지는 알려주지 않는다. – EJP

관련 문제