Socket.IO和AngularJS创建多个连接,如何停止

Socket.IO and AngularJS creates multiple connections, how to stop?

本文关键字:连接 何停止 IO AngularJS 创建 Socket      更新时间:2023-09-26

我正在使用AngularJS、Nodejs和socket.io服务器端和客户端库开发一个实时socket.io应用程序。我使用的是名为angular socket io的模块,但当我告诉angular进行连接时,我刷新页面的次数越多,似乎有多个连接一直在使用socket.io进行维护,而我现在是页面上唯一的用户。

在我的服务器日志中,我不断看到许多套接字ID打印出来,当我刷新应用程序页面时,它需要一段时间才能重新连接。看着控制台,我看到它经常与服务器通信(可能与多个套接字连接握手有关),但在一两分钟后,它终于稳定下来,并开始再次接收数据。

我觉得我做错了,还是这很正常?有人对在angular中使用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;
     });
    }
]);

就是这样,我不明白为什么它一直在与服务器建立这么多连接!感谢您的提前帮助!

您应该在有角度的页面中生成一个id(例如:随机字符串)。当您首先连接服务器时。将此id记录在服务器中,id就是绑定您的套接字。当客户端断开连接时,将调用服务器"断开连接"事件,侦听此事件并清理套接字。

回答我自己的问题。根据此页面,如果您有跨服务器或多个核心运行的nodejs实例,则必须使用RedisStore来排队并正确处理套接字请求。我在问题中描述的奇怪行为是,浏览器试图连接到我的4个核心中的一个,而其他核心却没有响应。我按照说明启用Redis作为SocketIO的数据存储,所有的问题都消失了。