2012-05-15 6 views
1

나는 Opa를 사용하여 온라인 다중 플레이어 게임을 만들고 있으며 클라이언트 연결을 조작하는 방법에 대해 몇 가지 질문이 있습니다. 연결 끊기 기능은 효과가 약 2 분 정도 소요클라이언트 연결을 조작하는 방법

function game_view(){ 
    function page_ready(){ 
     // observe game messages 
     _ = Network.observe(game_msg_received,game_channel); 

     // set disconnect function 
     _ = ClientEvent.set_on_disconnect_client(function(c){ 
      //do something when client is disconnected 
      ... 
     }); 
    } 

    <div onready={function(_){ page_ready() }}> 
     //page content 
     ... 
    </div> 
} 
  1. (I은 (는) 4 핑 실패의 시간 추측) 내 탭이나 창을 닫은 후, 너무 길어 : 여기

    내 코드 추출물이다 내 경우에는 어떻게 조정할 수 있습니까?

[SESSION] catch되지 않은 예외 : "{OpaRPC_Server : {나는이 페이지를 떠날 때

  • 일부 오류 메시지는 다음과 같이 나타납니다 잠시 후, (탭을 닫거나 다른 페이지로 이동) 다음과 같은 메시지는 건너 뜁니다. : 원한다면 (msg, st, ctx) {time : {클라이언트 : {클라이언트 : $ "46rrpwmeiq28ql0d8lgz7e35zt8d701c"; 페이지 : $ 934885115 $}; fun_id : $ "__ set_game_Mygame" 디버그 인쇄 설정 디버그 변수 session_debug> = 200

    페이지가 더 이상 존재하지 않기 때문에 재미라고 생각합니다. ction 'game_msg_received'는 게임 메시지를 받았을 때이 페이지를 알리려고 시도합니다. 그러면이 오류를 어떻게 피할 수 있습니까?

  • 답변

    3

    1 - 연결 해제 지연을 변경할 수는 없지만 비활성 이벤트를 사용할 수는 있습니다. 클라이언트가 서버의 관점 전혀 활동이없는 경우이 이벤트가 발생

    변경 비활성 이벤트에 대한 콜백을 등록하고 ClientEvent.set_inactivity_delay하는

    사용 ClientEvent.set_on_inactive_client (RPC 호출은, 메시지, ...를 전송) 기간.

    2 - 실제로 페이지가 더 이상 존재하지 않기 때문입니다. 네트워크에서 옵저버를 제거해야합니다. 이 경우 Network.unobserve을 사용하십시오.

    마지막으로 코드가 당신의 대답에 그

    // set default inactive delay 
    // or if you change the 1st params 
    // you can set for a specific client 
    ClientEvent.set_inactive_delay(none, /*wanted delay*/) 
    
    function page_ready(){ 
        // observe game messages 
        obs = Network.observe(game_msg_received,game_channel); 
    
        // set inactive function 
        _ = ClientEvent.set_on_inactive_client(function(c){ 
         // remove the observer 
         Network.unobserve(obs); 
         //do something when client is disconnected 
         ... 
        }); 
    } 
    
    +0

    감사처럼 보일 것이다, 그것은 유용합니다. 하지만 나는 내 행동에 대해 비합법적이라고 생각하지 않는다. 오랜 시간 동안 아무런 행동을 취하지 않고 게임을 계속할 수는있다. 예를 들어, 자신의 차례가 아니어도된다. 이것은 [Opa Poker] (http://poker.mlstate.com)와 유사합니다. 오빠 포커가 어떻게 해결하는지 모르겠습니다. 페이지가 준비되면 주기적으로 하트 비트를 보내려고합니다. 비용이 너무 많이 들까 요? – winbomb

    +0

    예, 세션을 사용하여 하트 비트를 구현하면 하트 비트로 한 메시지 비용이 발생합니다. –

    +0

    나는 당신이 원하는 것을 구현하는 더 좋은 방법이라고 생각한다. 그것은 하나의 서버 세션이고, 단지 세션에 void 메시지를 보내는 클라이언트 타이머이다. 하지만 {unload} Dom.event를 사용하여 서버 연결 해제 함수를 호출 할 수도 있습니다. 클라이언트가 브라우저를 제대로 종료하면 트리거되어야합니다 (충돌, 강제 종료 등). –

    관련 문제