JS의 웹 소켓 하트 비트, 시간 초과로 인해 다시 연결을 끊고 다시 연결

. (1)  함수 longSock (URL, FN, 인트로 = '' ) {
 2    = lockReconnect 송출 false로  //의 반복 방지 연결 
. 3    송출 = timeoutFlag true로 
. 4    timeoutSet =하게 는 null 
. 5    송출 reconectNum = 0
 . 6    CONST 제한 시간 = 30000 // 타임 아웃 간격 재접속 
. 7    송출 WS
 . 8    함수 재접속 () {
 . 9      IF (lockReconnect)가 반환 
10      lockReconnect = 
. 11      // 재접속되지 연결 과도한 요구 피하기 위해 제공된 지연 
(12)은      IF (reconectNum <. 3 ) {
13은        의 setTimeout ( 함수 () {
 14          timeoutFlag = true로 
15          createWebSocket ()
 16          console.info (인트로 '$ {} 제 재접속 reconectNum +이다. (1) {$ } times`)
 . 17          reconectNum ++
 18은          lockReconnect = 거짓 
. 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        하자 카운트 = 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 = 새로운 웹 소켓 (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는 이름 웹 소켓을 닫 쉽게 요구할         
. 5  }
 6.  
7.   CONST = wssCenter의 createSocket (WSS ': // URL `핸들러 '접수 센터 - 작은 카드 ") 
8.  
9.  
10  
(11). wssCenter.close ();   // 단절

 

추천

출처www.cnblogs.com/taxi/p/11199482.html