보통이다 OS 레벨 네트워킹을 끄고, 소켓에 쓰기는 예외를 던져야한다. 그래서 연결이 끊어 졌다는 것을 알게됩니다.
하지만 일반적으로 패킷이 전달되는지는 알 수 없습니다. 자바 (아마 너무 C)에서, 패킷 ACK'ed 있는지 확인하는 방법은 없습니다.
TCP ACK를 확인할 수 있다고해도 서버가 또는을 수신했다고 보장하지 않습니다. 대상 머신이 패킷을 수신하여 메모리에 버퍼링했음을 나타냅니다. 그 후 많은 일이 잘못 될 수 있습니다.
정말 확실한 경우 전송 프로토콜에 의존 할 수 없습니다. 응용 프로그램 수준 ACK이 있어야합니다. 즉, 서버 응용 프로그램은 및을받은 후 ACK 메시지를 다시 쓰고 클라이언트에서 메시지를 처리했습니다.
클라이언트 관점에서 볼 때 서버에 메시지를 쓰고 서버에서 ACK를 읽으려고합니다. 메시지를 받으면 메시지가 및으로 처리되었음을 확신 할 수 있습니다. ACK를 얻지 못하면 무슨 일이 일어 났는지 전혀 모른다. 경험적으로 대부분의 TCP는 실패했습니다. 다음 가능성은 서버가 추락했다는 것입니다. ACK가 클라이언트에 도달 할 수 없다는 것을 제외하고는 모든 것이 OK 일 수도 있습니다.
누군가가 내 질문의 제목을 변경하는 것을 혼란스럽게 생각합니다. 무슨 일 이니? – aryaxt
위 코드를 사용하면 SocketChannel이 여전히 연결되어 있는지 확인할 수 있습니다. 정확히 무엇을 테스트 했습니까? Socket은 제목이나 코드에 표시된 질문이나 채널에서 언급 했습니까? 사람들이 내 대답을 downvoting하기 시작한 이유는 ... (이유를 설명하지 않고 ...) –
1- 메서드를 호출하여 수동으로 소켓을 닫습니다. 그래서 서버에서 연결을 끊은 후에 false가되는 경우입니다. "연결 손실"과 같은 연결 끊김 문제가 있는지 감지하려고하기 때문에 소켓에 서버에 메시지를 보내고 예외가 발생하지 않으면 연결이 끊어지는 것을 감지하지 못합니다. 2- 나는 또한 셀렉터를 사용하고 있다고 언급했다. 그래서 서버에 연결되어 있는지 여부는 isConnected 메서드가 표시되지 않지만 내 소켓이 선택기에 계속 연결되어 있는지 여부가 표시됩니다. 소켓이 셀렉터에 연결되어 있으면 true를 반환합니다. – aryaxt