socketio客户端:如何处理socketio服务器

时间:2013-05-18 21:22:15

标签: socket.io

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

我在头文件中包含了远程socket.io代码:

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

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

if(typeof io != 'undefined')
        this.socket = io.connect(this.settings.server);
    else
        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(function(jqxhr, settings, exception) {
        setTimeout(function() {
            bot.control.handleDisconnect();
        }, 5000);
    });
}

我是否以正确的方式解决这个问题?

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

socket.on(...

当套接字尚不存在时。我可以将它们包装在一个函数中并在成功重新连接时检测到全局套接字对象时调用它吗?如果包含socket.on ...的函数被多次调用(如果服务器在运行期间多次关闭)会不会有问题?

1 个答案:

答案 0 :(得分:0)

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

<script src="<?=NODE_HOST?>/socket.io/socket.io.js"></script>
<script>
    var nodeHost = '<?=NODE_HOST?>';
</script>
// Attempt to connect to nodejs server
botController.prototype.start = function() {    

    // Is our nodejs server up yet?
    if(typeof io != 'undefined') {
        this.socket = io.connect(this.settings.server);
        this.startSocketEvents();
    } else {
        this.handleDisconnect();
    }
}

// Our connection to the server has been lost, we need to keep 
// trying to get it back until we have it!
botController.prototype.handleDisconnect = function(destroySocketObject) {

    if(destroySocketObject === undefined)
        destroySocketObject = true;

    // Destroy any cached io object before requesting the script again
    if(destroySocketObject)
        io = undefined;

    yepnope.injectJs(nodeHost+"/socket.io/socket.io.js",
        function(result) {

            // Did it actually download the script OK?
            if(typeof io != 'undefined') {
                bot.control.socket = io.connect(bot.control.settings.server);
                bot.control.startSocketEvents();
            } else {
                setTimeout(function() {
                    bot.control.handleDisconnect(false);
                }, 5000);
            }
        }
    );

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