2013-12-17 73 views
3

我正在開發一個使用AngularJS,Nodejs和Socket.io服務器和客戶端庫的實時socket.io應用程序。我使用稱爲angular-socket-io的模塊,但是當我告訴Angular連接時,我刷新頁面越多,似乎多個連接一直保持與Socket.IO一致,並且我現在是頁面上唯一的用戶。Socket.IO和AngularJS創建多個連接,如何停止?

在我的服務器日誌中,我不斷看到許多套接字ID打印出來,當我刷新應用程序頁面時,它需要一段時間才能重新連接。看着控制檯我看到它與服務器進行了很多通信(可能與多個套接字連接握手有關),但在一兩分鐘之後,它終於穩定下來並開始再次接收數據。

我想我做錯了,或者這是正常的?有沒有人有任何關於在角度使用Socket.IO的好建議,以便在頁面刷新時重新連接一次並擺脫所有以前的連接,以便始終保持唯一一個連接?

以下是一些代碼示例。爲了澄清,btford.socket-io將所有轉發的套接字事件與「套接字:」前綴相加。所以在我的例子中它將是「socket:start」。

myApp.js

angular.module('myApp', [ 'btford.socket-io', 'myControllers' ]) 
.config([ 'socketProvider', function(socketProvider) { 
    var appSocket = io.connect('http://live.myapp.com'); 
    socketProvider.ioSocket(appSocket); 
}]) 
.run(['socket', function(socket) { 
    socket.forward('error'); 
    socket.forward('start'); // this is the event i'm trying to listen for 
}); 

myController的

angular.module('myControllers').controller('startController', [ 
    '$scope', 
    function($scope) { 
     $scope.$on('socket:start', function(ev, data) { 

    $scope.activeDrivers.push({ 
     name: data.user.firstName + " " + data.user.lastName 
    }); 

    $scope.driversActiveTab.count = $scope.activeDrivers.length; 
    }); 
    } 
]); 

原來是這樣,我想不通爲什麼它一直與服務器建立這麼多連接!我在這裏先向您的幫助表示感謝!

回答

1

回答我自己的問題。根據this page,如果您有跨服務器或多核心運行的nodejs實例,則必須使用RedisStore排隊並正確處理套接字請求。我在我的問題中描述的奇怪行爲是瀏覽器試圖連接到我的4個內核之一,並且缺少來自其他內核的響應。我按照說明啓用了Redis作爲SocketIO的數據存儲,所有問題都消失了。

+0

我也面臨類似的問題,這是「https://stackoverflow.com/questions/46242518/node-js-socket-io-capture-and-stop-connection」。請幫忙。 – sand

2

你應該在你的角度頁面中生成一個id(例如:隨機字符串)。當你連接服務器first.record這個id在你的服務器,id是綁定你的套接字。當客戶端斷開連接時,將調用服務器'disconnect'事件,監聽此事件並清理套接字。

+0

感謝您的反饋。這也是很好的建議。我做了類似的方法來管理服務器端的連接。我的客戶端只需要一個websocket連接。 – jrthib