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 次 ping 失败的时间),对于我的情况来说太长了,我可以调整它吗?如何调整?

  2. 当我离开此页面(关闭标签或跳转到其他页面)时,一段时间后会出现一些错误消息,如下所示:

[SESSION] 未捕获的异常:“{OpaRPC_Server: {timeout: {client: {client: $"46rrpwmeiq28ql0d8lgz7e35zt8d701c"$; page: $934885115$}; fun_id: $"__set_game_Mygame"$}}}" 跳过以下消息。:如果你想要 (msg, st, ctx) 调试打印设置调试变量 session_debug >= 200

我认为这是因为该页面不再存在但功能'game_msg_received'仍然尝试在收到游戏消息时通知此页面,那么我该如何避免这个错误?

4

1 回答 1

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  
        ...
    });
}
于 2012-05-15T09:34:49.737 回答