2013-05-18 99 views
4

我有一個socketio服務器/客戶端很好地協同工作,但是我想開始編寫服務器在頁面加載或正常運行期間脫機時的事件。socketio客戶端:如何處理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 ...的函數被多次調用(如果服務器在操作期間多次關閉),會影響嗎?

回答

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事件

相關問題