2009-09-30 3 views
7

Java NIO API를 사용하여 논 블로킹 IO를 수행하는 서버를 작성했습니다. 가끔은 클라이언트 응용 프로그램이 갑작스럽게 중단되고 (예를 들어 전력 손실로 인해) 서버 측에서 연결이 열린 채로있는 상황이 나타납니다.NIO - 닫힌 연결 감지

동료가 동일한 문제를 겪었으며이 문제를 감지하기 위해 회선을 통해 하트 비트를 사용한다고했지만보다 쉬운 방법이 필요하다고 생각합니다. 다른 사람이이 문제를 겪었습니까?

몇 가지 추가 정보 : 읽기/쓰기 작업을 시도 할 때 현재 서버 설계가 IOException을 발견하면 해당 채널을 취소하고 해당 채널을 닫습니다. 이 방법은 99 %의 시간 동안 작동하는 것으로 보입니다. 나는 연결이 열린 것처럼 보이는 몇 가지 상황 만 보았습니다.

답변

6

앱 수준의 하트 비트가 없으면 TCP keepalive에만 의존 할 수 있습니다. 그러나 기본 간격은 매우 길습니다 (예 : 2 시간). RFC는 2 시간보다 짧은 간격을 권장하지 않습니다.

더 짧게 만들 수는 있지만 시스템 전체의 매개 변수입니다. 일부 OS에서는 커널을 다시 작성해야이 설정을 변경할 수 있습니다.

따라서 모든 TCP 기반 프로토콜에 하트 비트를 사용하는 것이 좋습니다.

+0

고마워요 ZZ 코더 - 그건 제가 생각한 것입니다. 나는 이것이 TCP의 기능이 아니라는 것에 놀랍니다. – Adamski

+0

"핑 (ping)"보다는 오히려 이러한 응용 프로그램이 인간이 아닙니다. –