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);