サーバ・コード
websocket.js
'厳格な使用' CONSTを用WebSocket =( 'WS'を必要とします)。 constの接続 = 新しい地図(); CONSTコンストラクタ = 関数(ポート){ CONST自己 = この; self.webSocket = 新しいWebSocket.Server({ポート:ポート})。 }。 Constr.prototype.connect = 関数(){ CONST自己 = この; self.webSocket.on( '接続'、関数接続(WS){ 試みる{ ws.on( 'メッセージ'、機能着信(メッセージ){ 試みる{ 場合(connections.size> 2000 ){ ws.send( 1 )。 ws.close(); 返します。 } ws.send( 0 )。 もし(connections.get(メッセージ)&& connections.get(メッセージ).ws.readyState == WebSocket.OPEN){ connections.get(メッセージ).date = Date.now()。 connections.get(メッセージ).ws.isAlive = 真。 console.log(メッセージ + ':上次心跳时间' + connections.get(メッセージ).date)。 返します。 } connections.set(メッセージ、{ WS:WS、 日付:Date.now() })。 console.log( '客户端IMEI:' +メッセージ+ '握手、心跳成功时间:!' + connections.get(メッセージ).date)。 ws.on( 'クローズ'、関数のクローズ(){ にconsole.log( '连接关闭' + メッセージ) // ws.reconnect(); 場合(connections.get(メッセージ)){ 接続。削除(メッセージ); } ws.close(); }); ws.on('エラー'、機能閉じる(){ console.error(メッセージ + ':エラーがオフラインを強制的に!' ); connections.get(メッセージ) .WS (.closeを); }); // サーバーはメッセージを受け付けピンポン++黄龍、MTKピング、ピンポンとサーバを受け入れるように決定することが開き // ws.on( 'ピンポン'、関数(){ // connections.get(メッセージ)= .date Date.now(); // connections.get(メッセージ)= .ws.isAlive trueに; // はconsole.log( '前回受信ピンポン' + connections.get(メッセージ).date); // }); } キャッチ(E){ console.error(「ONメッセージエラー: " 、E)。 } }); } キャッチ(E){ (console.error '接続エラーに:' 、E)。 } })。 self.webSocket.on( 'エラー'、関数(){ にconsole.log( 'エラー' ); }); }。 Constr.prototype.send = 関数(OBJ){ にconsole.log( '下推消息:' + JSON.stringify(OBJ))。 CONST imeiArray = obj.imei.split( '' )。 以下のために(私は++;;私は<imeiArray.length私は= 0ましょう{) してみてください{ 場合(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)。 } 他{ にconsole.log( 'IMEI:' + imeiArray [I] + '!ソケット关闭' )。 接続。削除(imeiArray [I])。 } } キャッチ(E){ にconsole.log( '发送消息发生严重错误IMEI:!' + imeiArray [I])。 } } }。 Constr.prototype.heartbeatCheck =関数(){ にconsole.log( 'ハートビートチェックのための:このハンドシェイク接続' + connections.size + 'クライアント' + 。connections.keys()のtoString()); IF(connections.size === 0 ) { リターン; } connections.forEach(関数(値、キー){ IF(Date.now() - 60000 value.date> ){ 。接続の削除)(キーと、 トライ{ value.ws.close(); } キャッチ( E){ console.error( 'エラー閉じる' 、E); } } //++黄龍、一時的に閉じピング機構は、MTKピング、ピンポンを受け入れることが決定され、サーバが開く // IF(falseにvalue.ws.isAlive ===)戻りvalue.ws.terminate(); // value.ws.isAlive = ; falseに // value.ws.ping(関数(){ // value.ws.send(2); // }); }); }; // Constr.prototype.testyuyin2 =関数(){ // 接続.forEach(関数(値){ // value.ws.send( '試験声'); // }); // }; module.exportsは=コンストラクタ。
app.js
CONST Wsが=( './ APP /ミドルウェア/用WebSocket'を必要とします)。 constのWS = 新しい Wsは(8080 ); 試す{ ws.connectを(); } キャッチ(E){ console.error( 'WSはエラーを接続する:' 、E)。 } はconsole.log( "のWebSocket建立完毕")
クライアント
CONSTはのWebSocket =( 'WS'を必要とします)。 VaRの lockReconnect = 偽 ; // 避免重复连接 VAR wsUrl = "WS://127.0.0.1:8080" ; VaRのWS。 VaRのTT; 関数createWebSocket(){ 試み{ WSが = 新規のWebSocket(wsUrl)。 その中に(); } キャッチ(E){ にconsole.log( 'キャッチ' + E)。 (wsUrl)再接続します。 } } 関数のinit(){ ws.onclose = 関数(){ console.log( '近いリンク' ); 再接続(wsUrl); }; ws.onerror = 関数(){ にconsole.log( '異常' ); 再接続(wsUrl); }; ws.onopen = 関数() { // ハートビートリセット )heartCheck.startを(; }; ws.onmessage = 関数(イベント){ // 現在接続されているすべてのメッセージが記載されている取得正常 にconsole.logを(+ 'メッセージが受信' JSON.stringify (event.data)); heartCheck.start(); } } 関数(URL){再接続 IF (lockReconnect){ リターン; }; lockReconnect = trueに; //は常にバックも接続されていない上に、要求は過度の遅延を回避するために提供されるであろう TT && てclearTimeout(TT)を、 TTは、のsetTimeout(= 関数(){ createWebSocketを(URL); lockReconnect = falseに; }、 4000 ); } // 心拍 VAR heartCheck = { タイムアウト: 3000 、 timeoutObj:ヌル、 serverTimeoutObj。ヌル、 開始:機能(){ // はconsole.log( 'スタート'); VARの自己を= この; この .timeoutObjてclearTimeout &&(この.timeoutObj); この .serverTimeoutObjてclearTimeout &&(この.serverTimeoutObj); この .timeoutObj = setTimeout(関数(){ // ハートビートを送信し、戻りハートビートメッセージ、後端を受け ws.send( "666666" ); self.serverTimeoutObjはのsetTimeout(= 関数(){ // はconsole.logを(111 ); // にconsole.log(WS); ws.close(); // createWebSocket(); }、self.timeout)。 }、この.timeout) } } createWebSocket(wsUrl)。