JS用WebSocketのハートビート、タイムアウトの再接続を切断し、再接続します

1  関数 longSock(URL、のFn、イントロ= '' ){
 2    LET = lockReconnect falseに // 繰り返し接続を回避するには、
3    LET = timeoutFlag 真の
4    LET timeoutSet = ヌル
。5    reconectNum = 0ましょう
 。6    CONSTタイムアウト= 30000 // タイムアウト間隔再接続
7    LET WS
 。8    関数再接続(){
 9は、     IF(lockReconnect)を返す
10      lockReconnect = trueに
。11      // 再接続しません接続、過剰な要求を回避するために設けられた遅延
12は、     IF(reconectNum <3 ){
13である        のsetTimeout(関数(){
 14          timeoutFlag = trueに
15          createWebSocket()
 16          console.info(イントロ`$ {}第1の再接続reconectNum +である。1 {$ } times`)
 。17          reconectNum ++
 18は          lockReconnect = falseに
19        }、5000)/ / ここで提供さは(MS)離間再接続
20である     }
 21である   }
 22である   // ハートビート検出器
23は    CONST heartCheck = {
 24      タイムアウト:5000、// MS 
25      :timeoutObj ヌル26であります     serverTimeoutObj:ヌル27      リセット:関数(){
 28        てclearInterval(この.timeoutObj)
 29        てclearTimeout(この.serverTimeoutObj)
 30        リターン この
31      }、
 32      スタート:関数(){
 33        CONST自己= この
34        LETカウント= 0
 35         .timeoutObj =たsetInterval(()=> {
 36          場合(<3カウント){
 37            であれば(ws.readyStateを=== 1 ){
38              ws.send( 'ハートビート' 39              console.info( `$ {イントロダクション}ハートビート第$ {+ 1カウント次の`})
 40            }
 41            カウント++
 42          } {
 43            てclearInterval(この.timeoutObj)
 44            カウント= 0
 45            もし(=== ws.readyState === 0 && ws.readyState 1 ){
 46              ws.close()
 47            }
 48          }
 49        }、self.timeout)
 50      }
 51    }
 52   CONST createWebSocket =()=> {
 53      console.info( `$ {イントロダクション}创建11 ')
 54      timeoutSet =のsetTimeout(()=> {
 55        であれば(timeoutFlag && reconectNum <3 ){
 56          console.info(` $ {イントロ}重连22`)
 57          reconectNum ++
 58          createWebSocket()
 59        }
 60      }、タイムアウト)
 61      、WS = 新規のWebSocket(URL)
 62  
63      ws.onopen =()=> {
 64        reconectNum = 0
 65        timeoutFlag = 
66       clearTimeout(timeoutSet)
 67        heartCheck.reset()(開始)。
 68      }
 69      ws.onmessage = EVT => {
 70        heartCheck.reset())(開始。
 71        // console.info(EVT)。
72        場合(evt.data === 'ハートビート')を返す
73        FN(EVT、WS)
 74      }
 75      ws.onclose = E => {
 76        console.info( `$ {イントロダクション}关闭11 '、e.code)を
 77        であれば(e.code!== 1000年){
 78          timeoutFlag = 
79          てclearTimeout(timeoutSet)
 80         再接続()
 81        } {
 82          てclearInterval(heartCheck.timeoutObj)
 83          てclearTimeout(heartCheck.serverTimeoutObj)
 84        }
 85      }
 86      ws.onerror = 関数(){
 87        console.info( `$ {11 '错误イントロ})
 88        再接続()// 重连
89      }
 90    }
 91    createWebSocket()
 92の   戻りWS
 93  }
 94輸出デフォルト longSock
1   // メソッド呼び出し
2 CONST =ハンドラ(EVT、WS)=> {
 3。    // EVTはwebsockettデータである
4つの。    // WS名が用WebSocketを閉じることが容易である要求         
5。 }
 6。 
7。   CONST = wssCenterのcreateSocket(WSS `:// URL `、ハンドラ、 '受付センター-小カード')
8。 
9。 
10  
11。 wssCenter.close();   // 切断

 

おすすめ

転載: www.cnblogs.com/taxi/p/11199482.html