多个websockets的问题(随着时间的推移)

时间:2017-09-26 18:11:41

标签: javascript c# angularjs websocket websocket-sharp

TLDR :我的网页套件在一段时间后停止连接,尽管它们最初工作正常。我该如何解决?

我有一个C#Web服务,它使用两个websockets(通过websocket-sharp)。它们的定义如下:

    public WebSocketServer sock1= new WebSocketServer("ws://localhost:802");
        sock1.Log.Level = WebSocketSharp.LogLevel.Error;
        sock1.Log.File = "LOG\\logfile.LOG";
        sock1.AddWebSocketService<StatusWebSocket1>("/");
        sock1.KeepClean = false;
        sock1.Start();
    public WebSocketServer sock2= new WebSocketServer("ws://localhost:803");
        sock2.Log.Level = WebSocketSharp.LogLevel.Error;
        sock2.Log.File = "LOG\\logfile.LOG";
        sock2.AddWebSocketService<StatusWebSocket2>("/");
        sock2.KeepClean = false;
        sock2.Start();

这些websocket服务器接受来自我的angularjs app的客户端连接:

$scope.socket = null;
    var startStopPolling = function(action){
        if(action == 'close'){
            $scope.socket.close(3001, 'User leaving page.');
            return;
        }
        var path = 'ws://' + window.location.hostname + ':802/';
        $http({method: 'GET', url: apiRoot+'is-remote', timeout: 1000})
            .success(function(response) {
                path = 'wss://' + window.location.hostname + '/';
            }).finally(function(){
                $scope.socket = new WebSocket(path);
                $scope.socket.onerror = function(event){
                    console.log('SOCKET ERROR', event);
                    $timeout(startStopPolling, 1000);
                };
                $scope.socket.onopen = function(){
                    var selfInfo = {
                        locationCode: $scope.LocationCode,
                        token: BrowserStorageService.get('token'),
                        type: 'ClientRegistration',
                        mode: 'status'
                    };
                    $scope.socket.send(JSON.stringify(selfInfo));

                    $scope.socket.onmessage = function(event){
                        var data = JSON.parse(event.data);
                            //do some stuff with data
                        });
                    };
                };
            });
    };
    startStopPolling();

其他地方:

var socket2 = null;
var startStopPolling2 = function(action){
    if(action == 'close'){
        socket2.close(3001, 'App closing.');
        return;
    }

    var path2 = 'ws://' + window.location.hostname + ':803/';

    socket2 = new WebSocket(path2);
    socket2.onerror = function(event){
        console.log('SOCKET ERROR', event);
        $timeout(startStopPolling2, 1000);
    };
    socket2.onopen = function(){
        var selfInfo = {
            mode: 'status2',
            type: 'ClientRegistration'
        };
        socket2.send(JSON.stringify(selfInfo));

        socket2.onmessage = function(event){
             var data = JSON.parse(event.data);
             console.log('status2', data.status2);
             if(data.status2 == "Closed"){
                 $state.go("status");
             }
        };
    };
};
startStopPolling2();
$rootScope.$on('$destroy', function(){
    startStopPolling2('close');
});

该应用程序主要位于一个页面上。 (我们大部分时间都会显示状态页面,但允许用户离开以执行管理配置等操作。)当我们从status2套接字(socket2)收到某个状态值时,我们想要做一些事情,所以我们必须一直跟踪这一点。另一个插座只在该页面上有用,所以我们想在不需要它时摆脱它。

问题在于:该应用会定期通过location.reload(true)之类的通话刷新页面。 Wile一开始就完美运行,经过这么多次刷新后,套接字不再连接。控制台中没有错误,onOpen()函数都不会触发。 发生了什么,我该如何解决?

0 个答案:

没有答案