4

我有一个 socketio 服务器/客户端可以很好地协同工作,但是我想开始为服务器在页面加载或正常运行期间脱机时编写事件。

我在我的标题中包含了远程 socket.io 代码:

<script src="<?=NODE_HOST?>/socket.io/socket.io.js"></script>
<script>
    var nodeHost = '<?=NODE_HOST?>';
</script>

在我的客户端控制器中,我有

如果(类型 io != '未定义')
        this.socket = io.connect(this.settings.server);
    别的
        this.handleDisconnect();

如果a)在正常操作期间发生套接字断开连接,或者b)服务器在页面加载时关闭,我必须尝试一遍又一遍地重新连接的功能

botController.prototype.handleDisconnect = function() {

    $.getScript(nodeHost+"/socket.io/socket.io.js").done(function(script, textStatus) {

        bot.control.socket = io.connect(bot.control.settings.server);

    }).fail(函数(jqxhr, 设置, 异常) {
        设置超时(函数(){
            bot.control.handleDisconnect();
        }, 5000);
    });
}

我会以正确的方式解决这个问题吗?

我现在遇到的主要问题(这让我创建了这个问题)是服务器关闭时页面加载时的代码错误,因为我具有以下功能:

套接字.on(...

当套接字还不存在时。我可以将它们包装在一个函数中并在我检测到成功重新连接时存在全局套接字对象时调用它?是否多次调用包含 socket.on... 的函数(如果服务器在操作期间多次关闭)是否重要?

4

1 回答 1

0

好的,我设法提出了这个使用 yepnope 似乎运行良好的解决方案,我已经使用 Modernizr (它也为我处理了跨域问题)。

<script src="<?=NODE_HOST?>/socket.io/socket.io.js"></script>
<script>
    var nodeHost = '<?=NODE_HOST?>';
</script>
// 尝试连接 nodejs 服务器
botController.prototype.start = function() {    

    // 我们的 nodejs 服务器启动了吗?
    if(typeof io != '未定义') {
        this.socket = io.connect(this.settings.server);
        this.startSocketEvents();
    } 别的 {
        this.handleDisconnect();
    }
}

// 我们与服务器的连接已经丢失,我们需要保持
// 试图取回它,直到我们拥有它!
botController.prototype.handleDisconnect = function(destroySocketObject) {

    如果(destroySocketObject === 未定义)
        销毁套接字对象 = 真;

    // 在再次请求脚本之前销毁所有缓存的 io 对象
    if(destroySocketObject)
        io = 未定义;

    yepnope.injectJs(nodeHost+"/socket.io/socket.io.js",
        功能(结果){

            // 它真的下载了脚本好吗?
            if(typeof io != '未定义') {
                bot.control.socket = io.connect(bot.control.settings.server);
                bot.control.startSocketEvents();
            } 别的 {
                设置超时(函数(){
                    bot.control.handleDisconnect(false);
                }, 5000);
            }
        }
    );

其中 startSocketEvents() 函数包含我所有的 socket.on 事件

于 2013-05-18T23:01:56.940 回答