WebSocketのインスタントメッセージングを達成NodeJs(第二版)

 

 

 

サーバ・コード

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

 

おすすめ

転載: www.cnblogs.com/zyulike/p/11434032.html