2011-10-12 3 views
4

내 휴대 전화에서 내 GAE 애플리케이션을 사용하고 있습니다. 내가 socket.close() 함수에 의해 소켓을 수동으로 닫더라도 채널 api에서/_ah/channel/disconnected로 연결 해제 알림을받는 데 문제가 있습니다. 게시물은 1 분의 말을 지연 한 후에 발생합니다. 누구든지 속도를 높이는 방법을 알고 있습니까? 내 경우 socket.close()는 채널 단절 알림을 생성하지 않습니다 (단, 전화에서만 가능합니다. 노트북에서 완벽하게 작동합니다)!Google 앱 엔진 채널 API의 채널 연결 해제 알림

답변

4

채널 API 프런트 엔드 서버가 채널 연결이 해제되었음을 "인식"하는 데 걸리는 시간은 브라우저 구현에 따라 달라집니다.

잘 작동하는 브라우저에서 beforeunload 이벤트를 포착하여 프런트 엔드에 "this client is going away"메시지를 게시합니다. 다른 브라우저에서는 이벤트를받지 못할 수도 있습니다 (또는 브라우저가 너무 자주 보내는 것처럼 (FFFUUU IE)) 다양한 구현 이유 때문에 수신하지 못할 수도 있고, 보내면 XHR에서 얻을 수있는 이벤트를 얻을 수도 있습니다 삼켰다. 이 경우 프론트 엔드 서버는 하트 비트를 수신하지 못해 클라이언트가 사라 졌음을 알게됩니다. 이는 휴대 전화에서 일어나는 일입니다. (호기심에서 벗어난 전화는 무엇입니까?)

onclose를 명시 적으로 호출하기 때문에 사례가 흥미 롭습니다. 이것은 채널 FE 코드가있는 iframe을 처리하는 것입니다. 즉, onclose는 브라우저 창 전체가 닫힌 것처럼 동작합니다. 브라우저가 여전히 양호한 상태이고 메시지를 보낼 때까지 기다릴 수 있다는 이점을 이용하지 않습니다.

그래서 두 가지를 권장합니다. 채널에 수동으로 XHR을 만들 수 있도록 사용자 정의 코드를/_ah/disconnect 핸들러와 동일한 코드에 추가하십시오. 이것은 kludgy이지만 기능적입니다. 이것에 대한 불만은 자바 스크립트 코드에서 클라이언트 ID를 명시 적으로 알아야 할 필요가 있다는 것입니다.

둘째, onclose가 명시 적으로 호출 될 때 더 나은 연결 해제 알림을 요청하려면 문제 추적기 (http://code.google.com/p/googleappengine/issues/list)에 문제를 추가하십시오.

희망이 도움이됩니다. 미안하지만 지금은 쉬운 대답이 아닙니다.

+0

네 포인트를 얻었습니다. 하지만 여전히 사용자 정의 처리기를 추가하고 거기에서 로직을 수행하더라도 브라우저 beforeunload 이벤트가 발생하고 채널의 연결이 끊어지면 어떻게 될까요? beforeunload 이벤트도 들으라고 나에게 말하는거야? 이 기능은 휴대폰에 아무런 메쉬 없이도 작동합니까? – Hari

+0

나는 지금 막 onbeforeunload가 사파리에 의해 iPad, iPhone 등등에 달리는 것이 지원되지 않는다는 것을 것을을 발견했다. 나는 그것이 직면하고있는 문제다고 생각한다. 그래서 이전 게시물에서 언급 한 것처럼 사용자 지정 처리기를 추가 할 수 있지만 사용자가 브라우저를 닫거나 다른 페이지로 이동하면 이벤트를 올바르게들을 수 없게됩니까? 이 문제를 해결할 다른 방법이 있습니까? 많은 감사합니다. – Hari

+0

문제를 설명하는 방식으로 채널에서 직접 닫기를 호출하는 것처럼 들렸습니다. 내 생각에, 그렇게했다면 XHR을 통해 앱에 메시지를 보낼 수도있었습니다 "나는이 채널을 닫고있다." 브라우저가 닫히고 onbeforeunload를 호출하지 않는 경우에도 쉽게 알 수 없습니다. 이것이 프론트 엔드에서 하트 비트를 사용하는 이유입니다. 하트 비트가 발생하지 않으면 채널을 닫고 응용 프로그램에 알립니다. –