2014-09-12 57 views
5

我正在使用節點套接字服務器和一個基於角度的套接字.io客戶端(使用angular-socket.io),它除了在一個特定的條件下運作良好:我不知道如何完全當套接字無法連接時完成套接字時會銷燬套接字。AngularJS:socket.io破壞套接字

工作流程是這樣的:在給定的頁面上有一個按鈕來打開一個模式,模式的打開將插座工廠注入到模塊控制器中,並且連接到socket.io服務器。這一切都可以在套接字連接時正常工作。當模式關閉時,調用$ scope.destroy並且模態控制器中的處理程序嘗試清理套接字。

該模式可以關閉並重新打開多次,或只能重複打開一次。我多次創建/銷燬套接字的過程可能是我的問題的一部分,這可能不是正確的範例,但是當模式被關閉時,將無法與其交互,並且在頁面離開後,套接字當然不會不需要存在或保持連接。

創建套接字:

angular.module('app.common.newSocketFactory', ['btford.socket-io']) 
.factory('newSocketFactory', ['socketFactory', function(socketFactory){ 

return function(){ 
    return socketFactory({ioSocket:io.connect('http://localhost:3000', {forceNew: true})}); 
}; 

}]); 

注:

angular.module('...', [ 
    'app.common.newSocketFactory', 
    .... 
]) 
.controller('Controller', ['$scope', '$modalInstance', 'newSocketFactory', ... 
    function ($scope, $modalInstance, newSocketFactory, ...){ 
    ... 

    $scope.socket = newSocketFactory(); 

這是我毀處理程序:

$scope.$on('$destroy', function(){ 
    $scope.socket.emit('unlisten'); 
    $scope.socket.disconnect(); //have tried passing true too. 
}); 

這正常工作時,該插座能夠連接模式爲前關閉時,服務器中斷開連接的事件觀察到客戶端已斷開連接。另外,我可以關閉模​​式,然後關閉服務器並且不會嘗試重新連接。

當打開模式時服務器關閉時,發生傳輸錯誤並重新嘗試連接。如果此時關閉模式,錯誤將繼續,如果我重新啓動服務器,則重試成功,客戶端將連接到服務器。這個最糟糕的部分是我使用這個套接字來保持對一個硬件的原子訪問,硬件被第一個套接字鎖定。除非我重新啓動服務器,請允許套接字連接,然後關閉模式(在隔離範圍和socket.disconnect()上觸發$ destroy),我必須刷新整個頁面才能銷燬套接字。

這可能是一個angular-socket.io問題或一個普通的socket.io客戶端問題。我在github上詢問了angular-socket.io,但沒有迴應如何正確處理沒有響應的angular-socket.io客戶端套接字。我的問題是這樣的:A)如果我沒有用socket.io做一個主要的假人,我該如何安全地處理這個客戶端套接字和B)如果我這樣做是錯誤的,什麼是更好的方法去管理一個不應該在頁面間持續存在的websocket。

注意:angular-socket.io套接字只是簡單地包裝了一些東西,以幫助處理角度範圍。當調用disconnect()時,結果看起來像底層套接字本身。我已經嘗試設置重新連接設置爲false等,但沒有一個工作,並且我不喜歡即使範圍完全被破壞,即使我可以破解它停止嘗試連接,套接字似乎仍然存在。

感謝

回答

1

當我處理了類似的問題我有SocketIO有凌亂狀態管理,至少可以說的結論......所以我想嘗試創建自己的重新連接邏輯,例如在斷開連接或錯誤時禁用重新連接,並且只在需要時重新連接。

我也考慮使用原生的SocketIO和狀態處理程序,如(stuff) => $timeout(() => myHandler(stuff)),並在其周圍放置一個單獨的角度服務。這樣,你的頭就不會爲關閉模態,失去示波器等而痛苦。

也請發送你的結果,我很感興趣,你從那時起經歷過的。

+1

嘿,謝謝你的回覆。我最近沒有做過這方面的工作,很快就沒有機會再次開展工作(這些功能已經推出了一段時間,似乎很穩定)。 對我們來說工作正常的最終結果是將配置(發送到io.connect)設置爲forceNew = true。從那裏,我手動創建套接字與 var ioSocket = io.connect(URL +':'+ PORT,options); var socket = socketFactory({ioSocket:ioSocket}); 從那裏,當試圖斷開連接時,我首先刪除套接字上的所有偵聽器,然後調用socket.disconnect()。到目前爲止,這對我們很有效。 – 2015-07-20 18:31:41

+0

謝謝,我們使用強制重新連接並手動調用disconnect()。我希望SocketIO傢伙能夠製造一個可靠的狀態機或其他... – 2015-07-20 23:26:28