Handling connection loss with websockets

前端 未结 4 1825
清酒与你
清酒与你 2020-12-07 10:32

I\'ve recently set-up a local WebSocket server which works fine, however I\'m having a few troubles understanding how I should handle a sudden loss of connection which neith

4条回答
  •  执笔经年
    2020-12-07 10:35

    I used the ping/pong idea and it works nicely. Here's my implementation in my server.js file:

    var SOCKET_CONNECTING = 0;
    var SOCKET_OPEN = 1;
    var SOCKET_CLOSING = 2;
    var SOCKET_CLOSED = 3;
    
    var WebSocketServer = require('ws').Server
    wss = new WebSocketServer({ port: 8081 });
    
    //Broadcast method to send message to all the users
    wss.broadcast = function broadcast(data,sentBy)
    {
      for (var i in this.clients)
      {
        if(this.clients[i] != sentBy)
        {
          this.clients[i].send(data);
        }
      }
    };
    
    //Send message to all the users
    wss.broadcast = function broadcast(data,sentBy)
    {
      for (var i in this.clients)
      {
        this.clients[i].send(data);
      }
    };
    
    var userList = [];
    var keepAlive = null;
    var keepAliveInterval = 5000; //5 seconds
    
    //JSON string parser
    function isJson(str)
    {
     try {
        JSON.parse(str);
      }
      catch (e) {
        return false;
      }
      return true;
    }
    
    //WebSocket connection open handler
    wss.on('connection', function connection(ws) {
    
      function ping(client) {
        if (ws.readyState === SOCKET_OPEN) {
          ws.send('__ping__');
        } else {
          console.log('Server - connection has been closed for client ' + client);
          removeUser(client);
        }
      }
    
      function removeUser(client) {
    
        console.log('Server - removing user: ' + client)
    
        var found = false;
        for (var i = 0; i < userList.length; i++) {
          if (userList[i].name === client) {
            userList.splice(i, 1);
            found = true;
          }
        }
    
        //send out the updated users list
        if (found) {
          wss.broadcast(JSON.stringify({userList: userList}));
        };
    
        return found;
      }
    
      function pong(client) {
        console.log('Server - ' + client + ' is still active');
        clearTimeout(keepAlive);
        setTimeout(function () {
          ping(client);
        }, keepAliveInterval);
      }
    
      //WebSocket message receive handler
      ws.on('message', function incoming(message) {
        if (isJson(message)) {
          var obj = JSON.parse(message);
    
          //client is responding to keepAlive
          if (obj.keepAlive !== undefined) {
            pong(obj.keepAlive.toLowerCase());
          }
    
          if (obj.action === 'join') {
            console.log('Server - joining', obj);
    
            //start pinging to keep alive
            ping(obj.name.toLocaleLowerCase());
    
            if (userList.filter(function(e) { return e.name == obj.name.toLowerCase(); }).length <= 0) {
              userList.push({name: obj.name.toLowerCase()});
            }
    
            wss.broadcast(JSON.stringify({userList: userList}));
            console.log('Server - broadcasting user list', userList);
          }
        }
    
        console.log('Server - received: %s', message.toString());
        return false;
      });
    });
    

    Here's my index.html file:

    
    
        
            
            
            Socket Test
        
        
            
            

    Here's a link to the cloud 9 sandbox if you want to try it out yourself: https://ide.c9.io/design1online/web-sockets

提交回复
热议问题