2011-11-08 1 views
0

Netty 서버 측에 청취자가 있습니까? 예기치 않게 클라이언트가 닫힐 때 (예 : 클라이언트 m/c의 LAN 케이블이 제거 된 경우) 알림이 전송됩니다. DefaultChannelHandler의 메소드가 호출되지 않습니다. LAN 케이블을 뽑았을 때 클라이언트가 비활성 상태 (데이터를 보내거나받지 않음)라고 가정합니다.클라이언트가 JBoss Netty에서 예기치 않게 닫히는 경우 알림 받기

아니면 채널이 유효한지 확인하기 위해 서버 측에서 Keep-Alive 모니터를 구현해야합니까?

답변

2

실제로 TCP/IP에서 예기치 않게 연결이 끊어지는 것을 감지 할 방법이 없습니다. 그렇게 할 수있는 방법이 있다면 '예기치 않게'호출해서는 안됩니다. :-)

끊어진 연결을 감지하는 가장 강력한 방법은 주기적으로 메시지를 보내거나 시간 초과가있는 메시지 (예 : ping 메시지 보내기)를 기다리는 것입니다.

이 동작을 구현하려면 IdleStateHandler을 사용할 수 있습니다. 파이프 라인에 삽입하고 처리기가 IdleStateAwareChannelHandler 또는 IdleStateAwareChannelUpstreamHandler으로 확장되도록하십시오.

클라이언트와 서버가 LAN과 같이 잘 제어되는 네트워크에서 실행되는 경우 운영 체제가 TCP 연결 유지 패킷을 더 자주 보내도록 구성 할 수 있습니다. 자세한 내용은 TCP keepalive HOWTO을 참조하십시오. 그러나 이것이 WAN 환경에서 안정적으로 작동하는지는 의심 스럽습니다. (WAN 환경에서 TCP Keepalive timeout으로 실험 한 경우 이야기를 나누십시오.)

+0

감사합니다. 언급 된 행동을 시도 할 것입니다. – avis

0

파이프 라인에 ReadTimeoutHandler을 추가해 보았습니까? 서버가 주어진 시간 (초) 동안 채널로부터 데이터를 읽지 않은 후에 이것이 ReadTimeoutException을 던질 것이라고 나는 믿습니다.

저는 이것을 클라이언트에서만 사용하여 (예를 들어 UpTime 예제와 같이) 재 연결을 구현했지만 여기에서도 작동 할 수 있습니다.

+0

클라이언트에서 정기 핑 메커니즘을 사용하여 서버에서 IdleStateHandler를 사용했습니다. 그게 :) – avis

0

페일 클로즈 연결 유지 기능을 설계하고 구현했습니다. 여기서 중요한 것은 타임 아웃 후에 채널을 닫은 다음 다시 여는 것입니다.

관련 문제