ibm bluemix nodejs和websockets在客户端保持关闭

时间:2016-04-29 02:40:38

标签: javascript node.js websocket ibm-cloud

在IBM bluemix中,即使我的服务器代码没有启动任何关闭,我的节点客户端也会关闭其websocket连接。

我的服务器端代码如下:

app.ws('/problemUpdate', function(ws, req) {
    // if we have the maximum number of clients, remove the oldest
    if (clients.length>MAX_CLIENTS){
        ws=clients.pop();
        ws.close();
    }
    clients.unshift(ws);

    ws.on('close', function(msg) {
        // on close, remove clients
        for (var i = 0; i < clients.length; i++) {
            if(clients[i]==ws){
                console.log("removing");
                clients.splice(i,1);
            }
        }
    });
    ws.on('message', function(msg) {
        if (readyToSend(ws)){
            ws.send(ws); 
        }
    });
    // listen the event
    eventEmitter.on('updateProblem', function(updatedProblem){
        //Broadcast to all clients
        console.log("Total Clients: "+clients.length);
        for (var i = 0; i < clients.length; i++) {
            var client = clients[i];
            if (readyToSend(client)){
                client.send(updatedProblem);
            }
        }
    });
});

我的客户端websocket相关代码如下:

updateWebsocket(webSocketProblemUpdate);

    function updateWebsocket(socket){
        socket.onopen = function(){
            console.log("Connection Opened");
        }
        socket.onclose = function(){

        }
        socket.onerror = function(evt){
            console.log("The following error occurred: " + evt.data);
        }
        socket.onmessage = function(evt){

            var jsonProblem = JSON.parse(evt.data);
            var problemName = jsonProblem.envelope.problemName;
            delete jsonProblem["envelope"];
            var option = document.createElement('option');
            option.text=problemName;
            option.value=problemName;
            var alreadyAdded=false;
            [].forEach.call(  document.getElementById('problems')  , function(elm){
                if(elm.value==option.value && elm.text==option.text){
                //if(elm.text==option.text){
                    alreadyAdded=true;
                    // update the content of an already added scenario
                    accumulatedJsonProblems[problemName]=JSON.stringify(jsonProblem);
                    $('.problems').change();
                }
            })
            if (!alreadyAdded){
              accumulatedJsonProblems[problemName]=JSON.stringify(jsonProblem);
              var select = $("#problems")[0];
              select.add(option,$('#problems').children('option').length);
              document.getElementById('problems').value=problemName;
               $('.problems').change();
              console.log("The following data was received:" + JSON.stringify(jsonProblem));
            }
        }
    }

关于什么是关闭我的网络套接字的任何线索?

谢谢, 亚伦

1 个答案:

答案 0 :(得分:1)

经过一番研究,我发现IBM bluemix每2分钟关闭一次连接。实施了安全标准。为了解决这个问题,我每隔5分钟从客户端重新打开websocket,并重新打开客户端关闭。

//refresh the websocket every 5 minutes
    setInterval(function() {
        console.log("Interval expired, refreshing websocket");
        // only closing because the on close method automatically opens a new websocket
        webSocketProblemUpdate.close();
    }, 300000); 

socket.onclose = function(){
            console.log("Connection Closed");
            window.WebSocket = window.WebSocket || window.MozWebSocket;
            webSocketProblemUpdate = new WebSocket("ws://"+window.document.location.host+"/problemUpdate");
            updateWebsocket(webSocketProblemUpdate);
        }

干杯, 亚伦