1

TLDR:我的 websocket 会在一段时间后停止连接,尽管它们一开始工作得很好。我如何解决它?

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

    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 应用程序的客户端连接:

$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). 起初它工作得很好,经过这么多次刷新后,套接字不再连接。控制台中没有错误,也没有onOpen()函数触发。发生了什么事,我该如何解决?

4

0 回答 0