2012-05-15 90 views
1

我正在使用Opa進行在線多玩家遊戲,並對如何操作客戶端連接有一些疑問。如何操縱客戶端連接

這裏是我的代碼片段:

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. 斷接功能生效約2分鐘(我想這是4個平故障時間)後關閉我的標籤或窗口,它太長了對於我的情況,我可以調整它,以及如何?

  2. 當我離開這個頁面(關閉選項卡或跳轉到其他網頁),一段時間後,一些錯誤的信息將顯示如下:

[會議]未捕獲的異常:「{OpaRPC_Server:{ timeout:{client:{client:$「46rrpwmeiq28ql0d8lgz7e35zt8d701c」$; page:$ 934885115 $}; fun_id:$「__ set_game_Mygame」$}}}「 以下消息被跳過。: 如果你想要(msg,st,ctx)調試打印設置調試變量session_debug> = 200

我認爲這是因爲該頁面不再存在,而是有趣ction'game_msg_received'仍嘗試在收到遊戲消息時通知此頁面,那麼如何避免此錯誤?

回答

3

1 - 您無法更改斷開連接延遲,但也許可以使用不活動事件。

如果客戶端已經沒有查看服務器的點的活動將引發此事件(RPC調用,發送消息,...)

使用ClientEvent.set_on_inactive_client註冊一個回調無效事件和ClientEvent.set_inactivity_delay改變持續時間。

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)類似。我不知道Opa Poker如何解決它。我現在試圖在頁面準備好的時候定期發送心跳信號,這會花費太多嗎? – winbomb

+0

是的,這是一個解決方案,如果您使用會話來實現您的心跳,它將通過心跳消耗一個消息。 –

+0

我認爲更好的方法來實現你想要的東西,它是一個服務器會話和一個客戶端定時器,它只是向會話發送一個無效消息。但也許你也可以使用{卸載} Dom.event調用服務器斷開連接功能?如果客戶端正確關閉瀏覽器(不會崩潰,硬殺等),它應該被觸發。 –