NodeJs achieve WebSocket instant messaging (Second Version)

 

 

 

Server code

websocket.js

'use strict'

const WebSocket = require('ws');
const connections = new Map();
const Constr = function(port) {
  const self = this;
  self.webSocket = new WebSocket.Server({ port: port });
};
Constr.prototype.connect = function() {
  const self = this;
  self.webSocket.on('connection', function connection(ws) {
    try {
      ws.on('message', function incoming(message) {
        try {
          if (connections.size > 2000) { 
            ws.send(1);
            ws.close();
            return;
          }
          ws.send(0);
          if (connections.get(message) && connections.get(message).ws.readyState == WebSocket.OPEN) {
            connections.get(message).date = Date.now();
            connections.get(message).ws.isAlive = true;
            console.log(message + ':上次心跳时间' + connections.get(message).date);
            return;
          }
          connections.set(message, {
            ws: ws,
            date: Date.now(),
          });
          console.log('客户端imei:' + message + '握手、心跳成功!时间:' + connections.get(message).date);
          ws.on('close', function close() {

            console.log('连接关闭   ' +  message)
            // ws.reconnect();
            if (connections.get(message)) {
              connections.delete(message);
            }
            ws.close();
          });
          ws.on('error', function Close () { 
            console.error (Message + ':! error forced offline' ); 
            connections.get (Message) 
              .ws 
              .close (); 
          }); 
          // server accepts pong message ++ huanglong, determining to accept mtk ping, pong and the server opens 
          // ws.on ( 'pong', function () { 
          //    connections.get (Message) = .date Date.now (); 
          //    connections.get (Message ) = .ws.isAlive to true; 
          //    the console.log ( 'received last time pong' + connections.get (Message) .date); 
          // }); 
        } the catch (E) { 
          console.error ( 'ON Message error: ' , E); 
        }
      });
    }catch (e) {
      console.error('on connection error:', e);
    }
  });
  self.webSocket.on('error',function(){
    console.log('error');
  });
};
Constr.prototype.send = function(obj) {
  console.log('下推消息:' + JSON.stringify(obj));
  const imeiArray = obj.imei.split(',');
  for (let i = 0; i < imeiArray.length; i++) {
    try {
      if (connections.get(imeiArray[i]) && connections.get(imeiArray[i]).ws.readyState === WebSocket.OPEN) {
        console.log(imeiArray[i] + ':连接状态' + connections.get(imeiArray[i]).ws.readyState);
        connections.get(imeiArray[i]).ws.send(obj.str);
      } else {
        console.log('imei:' + imeiArray[i] + 'socket关闭!');
        connections.delete(imeiArray[i]);
      }
    } catch (e) {
      console.log('发送消息发生严重错误!imei:' + imeiArray[i]);
    }
  }
};


Constr.prototype.heartbeatCheck = function () { 
  the console.log ( 'heartbeat checks: this handshake connections for the' + connections.size + 'client:' + . connections.keys () toString ());
   IF (connections.size === 0 ) {
     return ; 
  } 
  connections.forEach ( function (value, Key) {
     IF (Date.now () - value.date> 60000 ) { 
      Connections. Delete (Key);
       the try { 
        value.ws.close (); 
      } the catch ( E) { 
        console.error ( 'error Close' , E); 
      } 
    } 
    //++ huanglong, temporarily closed ping mechanism, is determined to accept mtk ping, pong and the server opens 
    // IF (value.ws.isAlive === to false) return value.ws.terminate (); 
    // value.ws.isAlive = to false; 
    // value.ws.ping (function () { 
    //    value.ws.send (2); 
    // }); 
  }); 
}; 
// Constr.prototype.testyuyin2 = function () { 
//    Connections .forEach (function (value) { 
//      value.ws.send ( 'test voice'); 
//    }); 
// }; 
module.exports = Constr;

app.js

const Ws = require('./app/middleware/websocket');

const ws = new Ws(8080);
try {
    ws.connect();
} catch (e) {
    console.error('ws connect error:', e);
}

console.log("WebSocket建立完毕")

 

 

Client

const WebSocket = require('ws');

var lockReconnect = false;//避免重复连接
var wsUrl = "ws://127.0.0.1:8080";
var ws;
var tt;
function createWebSocket() {
    try {
        ws = new WebSocket(wsUrl);
        init();
    } catch (e) {
        console.log('catch' + e);
        reconnect(wsUrl);
    }
}
function init() {
    ws.onclose = function () {
        the console.log ( 'close links' ); 
        Reconnect (wsUrl); 
    }; 
    ws.onerror = function () { 
        the console.log ( 'the abnormality' ); 
        Reconnect (wsUrl); 
    }; 
    ws.onopen = function () {
         // heartbeat reset 
        heartCheck.start (); 
    }; 
    ws.onmessage = function (Event) {
         // get any messages are currently connected is described normal 
        console.log ( 'message received' + the JSON.stringify (the event.data)); 
        heartCheck.start (); 
    } 
} 
functionReconnect (URL) {
     IF (lockReconnect) {
         return ; 
    }; 
    lockReconnect = to true ;
     // will always back on even not connected, the request is provided to avoid excessive delay 
    TT && the clearTimeout (TT); 
    TT = the setTimeout ( function () { 
        createWebSocket (URL); 
        lockReconnect = to false ; 
    }, 4000 ); 
} 
// heartbeat 
var heartCheck = { 
    timeout: 3000 , 
    timeoutObj: null , 
    serverTimeoutObj:null,
    start: function () {
        // console.log('start');
        
            self.serverTimeoutObj = setTimeout(function () {
                // console.log(111);
                // console.log(ws);
                ws.close();
                // createWebSocket();
            }, self.timeout);

        }, this.timeout)
    }
}
createWebSocket(wsUrl);

 

Guess you like

Origin www.cnblogs.com/zyulike/p/11434032.html
Recommended