2011-01-26 3 views
7

AppEngine에 소셜 네트워크/데이트 유형 애플리케이션을 구축했으며 현재 채널 상단에 빌드 된 채팅을 추가하는 중입니다. API. 그러나 문제는 내가 페이스 북에서 할 수있는 것처럼 채팅이 진행되는 동안 사용자가 새 페이지를 다시로드하거나 탐색 할 수 있다는 것입니다. 이는 서버가 주어진 클라이언트에 대해 새로운 채널 ID 토큰을 생성해야하는지 또는 주어진 클라이언트가 이미 채널 토큰을 할당 받았는지 여부를 쉽게 알 수 없음을 의미합니다.AppEngine 채널 API - 채널이 아직 열려 있는지 확인하는 가장 좋은 방법 (서버 측)

특정 클라이언트에 이미 채널이 열려 있는지 확인 (서버 측)하는 방법이 있다면 매우 유용합니다. 예를 들어, 클라이언트 "Jack"에 "Jack-Jan-21-2010"의 채널 ID를 할당 한 경우 ID가 연결된 채널이 이미 열려 있으면 서버 측에서 확인할 수 있기를 원합니다. " Jack-Jan-21-2010 ". onerror() 및 onclose() 콜백을 관찰하여 클라이언트 측에서 추적 할 수 있지만 (일종의) 특정 ID와 연결된 채널이 있는지 확인하기 위해 서버 측에서 아무 것도 볼 수 없습니다. 이미 열려있어.

AppEngine 채널 API를 사용하면서 채널이 이미 열렸는지 확인하는 지능적인 방법 (서버 측)을 아는 사람이 있습니까?

답변

18

1 부 : 해결 당신이 정말로 클라이언트 연결을 추적 할 필요가 있지만, 문제를 해결할 것이다 당신이 요구하는지 만약 내가 당신의 질문에서 모르겠어요 경우 아래 문제

참조 2 부.

내가 문제를 되풀이 할 수 있는지 보도록하겠습니다. 채팅 앱을 작성하고 있지만 완전히 AJAX가 아닌 사이트를위한 것입니다 (즉, Gmail이 그렇듯이). 사이트에는 사용자가 다른 페이지로 연결되는 링크를 클릭 한 후 채널을 다시 설정해야하는 페이지 탐색 기능이 포함되어 있습니다. 사용자가 탐색 할 때 새 페이지가 렌더링되고 그 지점에서 새 토큰을 얻지 않으려 고합니다. 기존의 토큰 및 채널을 동일한 클라이언트 ID로 재사용하려고합니다.

맞습니다. 두 가지 대체 솔루션 중 하나는 쉽지만 좋지 않은 사용자 환경이 있습니다. 더 까다 롭지 만 결과가 훨씬 부드럽습니다.

  • 쿠키에 토큰을 보존합니다. 페이지를 다시 렌더링 할 때 channel.create_channel을 다시 호출하는 대신 쿠키의 토큰을 사용하면됩니다. 토큰이 만료되면 사용자가 원래 페이지에 머문 것처럼 일시 오류 콜백을받습니다. 이 시점에서 channel.create_channel을 다시 호출하십시오. 이 문제는 Comet 연결 특성으로 인해 재 연결 속도가 느려질 수 있습니다 (최악의 경우 최대 10 초 이상).

  • iframe에서 채팅과 관련없는 전체 사이트를 감쌀 수 있습니다. 외부 iframe에 채널 생성 코드와 UI를 삽입하십시오. 이렇게하면 사용자가 탐색 할 때마다 다시 연결할 필요가 없습니다. 이렇게하면 탐색시의 가동 중지 시간을 피할 수 있습니다. orkut은 플로팅 div로이 기술을 사용합니다. 소량의 Firebug 조사에서 밝힙니다.

2 부 : 그것은 내가 오해하고 있는데 당신이 정말로 클라이언트 연결을 추적해야합니까 밝혀

경우 기능 요청 :

여부를 확인하기 위해 내장 된 방법이 아니다

클라이언트는 이제 클라이언트 ID로 식별되는 채널에 연결됩니다.

그러나 지금은 "존재"(채팅의 의미)를 추가하여 클라이언트가 특정 클라이언트 ID로 만든 채널에 연결하거나 연결을 끊을 때 게시물을 등록 할 수 있도록 노력하고 있습니다.또한 존재 여부를 "조사"하여 주어진 클라이언트 ID가 연결되었는지 여부를 쿼리 할 수 ​​있습니다 (이 부분의 세부 사항에서 계속 작업 중임).

토큰 기반이 아니라 클라이언트 ID를 기반으로합니다.

아직 정확한 출시 날짜가 없지만 지금 말했듯이 나는 적극적으로 노력하고 있습니다.

그동안 클라이언트의 하트 비트 HTTP 요청을 사용하여 1 분마다 "안녕하세요, 아직 여기 있습니다"라는 앱을 사용할 수 있습니다. 2 분마다 실행되는 일종의 작업이 필요하며 비활성 상태로 체크인하지 않은 클라이언트를 표시하면이 데이터를 어딘가에 저장해야합니다.

+0

와우, 대단한 답. 나는 앞으로 몇 시간 동안 그것을 소화 할 것이다. 감사합니다. 친절하게 생각합니다. -Alex –

+0

정확하게 내 문제를 되풀이하여 제안한 솔루션이 적절한 해결 방법 인 것 같습니다. 나는 iframe 솔루션이 재미 있고 아마도 내 문제를 해결할 것이라고 생각합니다. –

+0

모이 셰, 다음 릴리스에서 "존재감"을 얻으 려한다면 맛있는 칠면조 샌드위치를 ​​사 드릴 것입니다. kthnx :) –

관련 문제