我正在使用AngularJS,Nodejs和Socket.io开发一个实时的socket.io应用程序服务器和客户端库。我正在使用名为angular-socket-io的模块但是当我告诉Angular连接时,我刷新页面越多,似乎多个连接继续使用Socket.IO维护,我现在是页面上唯一的用户。
在我的服务器日志中,我一直看到打印出许多套接字ID,当我刷新应用程序页面时,它需要一段时间才能重新连接。看着控制台我看到它与服务器进行了很多通信(可能与多插座连接握手有关)但经过一两分钟后,它最终稳定并再次开始接收数据。
我认为我做错了,或者这是正常的吗?有没有人有任何好的建议在角度使用Socket.IO,以便当页面刷新时重新连接一次并删除所有以前的连接,以便始终只维护一个?
这是一些代码示例。只是为了澄清一下,btford.socket-io用“socket:”前缀所有转发的套接字事件。所以在我的例子中它将是“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;
});
}
]);
就是这样,我无法弄清楚为什么它一直与服务器建立如此多的连接!感谢您的帮助!
答案 0 :(得分:2)
你应该在你的角度页面中生成一个id(例如:随机字符串)。当你首先连接服务器时,在服务器中记录这个id,id绑定你的套接字。当客户端断开连接时,将调用服务器'disconnect'事件,监听此事件并清理套接字。
答案 1 :(得分:1)
回答我自己的问题。每this page,如果您有跨服务器或多个核心运行的nodejs实例,则必须使用RedisStore排队并正确处理套接字请求。我在我的问题中描述的奇怪行为是浏览器试图连接到我的4个核心之一并且缺少来自其他核心的响应。我按照说明启用Redis作为SocketIO的数据存储,所有问题都消失了。