텔넷 클라이언트 연결이 끊어지면 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 클라이언트를 실행하고 나는 첫 번째 클라이언트를 닫을 때 정상 종료의 경우 그 외에도,이 경우,
오케이, 나는 그 이유에 대한 대답을 추측합니다. 그러나, 나는 정상 종료가 소켓 상태를 닫히지 않는 이유는 무엇인지 궁금하다. 이것은 소켓이 여전히 닫히지 않는다고 생각하기 때문에 isClosed()를 비효율적으로 만든다. –
글쎄, 정확히 isClosed() signifys를 모르지만 TCP 연결은 * 양쪽 끝이 연결을 닫을 때만 닫힌다. 끝은 그것을 다시 놓았다, TCP RST를 보냈다). TCP 연결은 한쪽 끝이 쓰기 방향을 닫았지만 다른 쪽 끝은 여전히 데이터를 보낼 수있는 반이중 상태 일 수 있습니다. – nos
@Seeyabye TCP에 '다이얼 톤'이 없으므로 한 쪽 소켓이 다른 쪽 소켓이 연결에서 I/O를 시도하는 것 이외의 다른 것을 닫았다는 것을 알 수있는 방법이 없습니다. 'isClosed()'와 친구들은 당신이 자신의 소켓에 무엇을했는지를 알려주지 만 연결에 어떤 일이 일어 났는지는 알려주지 않는다. – EJP