1

WebSocket 연결을 처리하기 위해 Play Framework 2.2.1을 사용하고 있습니다.서버의 WebSocket 연결 상태

일반적으로 다음과 같은 onClose 함수는 클라이언트가 의도적으로 (close 함수를 호출하여) 닫거나 클라이언트가 손상된 경우와 같이 원치 않는 이벤트에 의해 닫히는 경우에 호출됩니다.

socketIn.onClose(new F.Callback0() { 
        public void invoke() { 
          // Send a Quit message 
         } 
         }); 

여기의 문제는 원하지 않는 이벤트의 경우 onClose 콜백이 호출되지 않는 경우가 있습니다. 서버 측에서는 클라이언트가 여전히 연결되어있는 것처럼 보입니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 내가 온라인 상태인지, 아니면 클라이언트에서 서버로 핑 상태인지 알기 위해 매 초마다 클라이언트에게 핑을해야합니까?

+0

앱에서 웹 소켓 연결이 오랜 시간 동안 유휴 상태 일 수 있으므로 오랜 기간 동안 양방향으로 트래픽이 없음을 의미합니까? – mantithetical

답변

2

불행히도 쉬운 해결책은 없습니다. Here's a issue about it on Play's github. 특히 Play는 연결 자체가 손실되었다고 추측 할 수 없습니다.

재생이 읽기/유휴 시간 제한을 지원할 때까지 직접 구현할 수 있습니다. 우리의 브라우저 확장은 웹 소켓 연결을 영구적으로 유지하며 응용 프로그램 수준의 핑을 x 초마다 실행합니다. 회선이 너무 오래 조용한 경우 클라이언트와 서버 모두 연결을 끊을 수 있습니다.

자바 웹 소켓 API에 익숙하지 않지만 추상적으로 서버의 마지막 통신 시간을 기록하고 스레드/액터/예약 된 작업에서 이전 연결을 정리하려고합니다. 그런 다음 연결 상태를 유지하려면 소켓에서 ping을 실행하십시오. 클라이언트에서 ping을 시작하지만 (서버에서도 작동 함) 서버가 2 초 이내에 퐁하지 않으면 클라이언트는 연결을 끊고 다시 연결합니다.