program tip

웹 소켓이 닫히는 코드 1006으로 닫히는 이유 얻기

radiobox 2020. 11. 18. 08:54
반응형

웹 소켓이 닫히는 코드 1006으로 닫히는 이유 얻기


사용자에게 올바른 메시지를 보여줄 수 있도록 웹 소켓이 닫힌 이유를 알고 싶습니다.

나는 가지고있다

sok.onerror=function (evt) 
     {//since there is an error, sockets will close so...
       sok.onclose=function(e){
           console.log("WebSocket Error: " , e);}

코드는 항상 1006이고 이유는 항상 ""입니다. 그러나 나는 다른 종결 이유를 구분하고 싶습니다.

예를 들어 명령 줄은 "데이터베이스가 허용하지 않기 때문에 삭제할 수 없습니다"라는 오류 이유를 제공합니다. 하지만 Chrome 콘솔에서 그 이유는 여전히 ""입니다.

다른 종결 이유를 구분하는 다른 방법이 있습니까?


닫기 코드1006 는 브라우저 구현에 의해 연결이 비정상적으로 (로컬로) 닫 혔음을 의미하는 특수 코드입니다.

브라우저 클라이언트가 종료 코드를 1006보고하면 websocket.onerror(evt)이벤트에서 자세한 내용 을 확인해야합니다 .

그러나 Chrome은 자바 스크립트 측에 종료 코드 1006 이유를 거의보고하지 않습니다. 이는 웹 소켓 남용을 방지하기위한 WebSocket 사양의 클라이언트 보안 규칙 때문일 수 있습니다. (예 : 대상 서버에서 열린 포트를 검색하거나 서비스 거부 공격을위한 많은 연결을 생성하는 데 사용).

1006Websocket으로 HTTP를 업그레이드하는 동안 오류가 발생하면 Chrome은 종종 종료 코드를보고합니다 (웹 소켓이 기술적으로 "연결"되기 전의 단계입니다). 잘못된 인증 또는 권한 부여, 잘못된 프로토콜 사용 (예 : 하위 프로토콜을 요청하지만 서버 자체가 동일한 하위 프로토콜을 지원하지 않음) 또는 웹 소켓이 아닌 서버 위치와 통신하려는 시도와 같은 이유로 ( 에 연결 시도 등 ws://images.google.com/)

기본적으로 닫기 코드 1006가 표시되면 websocket 자체에 매우 낮은 수준의 오류가있는 것입니다 ( "Unable to Open File"또는 "Socket Error"와 유사). 이는 낮은 수준의 문제를 나타내므로 실제로 사용자를위한 것이 아닙니다. 코드 및 구현과 함께. 낮은 수준의 문제를 수정 한 다음 연결되면 더 합리적인 오류 코드를 포함 할 수 있습니다. 프로젝트의 범위 또는 심각도 측면에서이를 수행 할 수 있습니다. 예 : 정보 및 경고 수준은 프로젝트의 특정 프로토콜의 일부이며 연결을 종료하지 않습니다. 심각하거나 치명적인 메시지보고는 프로젝트의 프로토콜을 사용하여 원하는만큼 세부 정보를 전달한 다음 웹 소켓 닫기 흐름의 제한된 기능을 사용하여 연결을 닫습니다.

WebSocket 닫기 코드는 매우 엄격하게 정의되며 닫기 이유 문구 / 메시지는 길이가 123자를 초과 할 수 없습니다 (의도적 인 웹 소켓 제한).

그러나 디버깅 목적으로이 정보를 원하는 경우 모든 것이 손실되지는 않습니다. 폐쇄의 세부 사항 및 근본적인 이유는 종종 Chrome의 자바 스크립트 콘솔에 상당한 양의 세부 사항과 함께보고됩니다.


Chrome이 WebSocket 표준을 준수하지 않는 경우 인 것 같습니다. 서버가 닫기를 시작 하고 닫기 프레임을 클라이언트에 보낼 Chrome은이를 오류로 간주하고 코드 1006 및 이유 메시지없이 JS 측에보고합니다. 내 테스트에서 Chrome은 서버에서 시작된 닫기 프레임 (닫기 코드 1000)에 응답하지 않으며 코드 1006은 아마도 Chrome이 자체 내부 오류를보고하고 있음을 의미합니다.

PS Firefox v57.00은이 경우를 적절하게 처리하고 서버의 이유 메시지를 JS 측에 성공적으로 전달합니다.


내 및 아마도 @BIOHAZARD 경우에는 nginx proxy timeout. 기본적 60으로 소켓에서 활동이없는 초입니다.

나는 그것을 24h로 변경하고 nginx문제를 해결했습니다.

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;

Chrome을 클라이언트로 사용하고 golang gorilla websocket을 nginx 프록시에서 서버로 사용하는 동안 오류가 발생했습니다.

그리고 x 초마다 서버에서 클라이언트로 "핑"메시지를 보내면 문제가 해결되었습니다.


이것은 장치에서 사용중인 웹 소켓 URL이 동일하지 않을 수 있습니다 (Android / iphonedevice와 다른 웹 소켓 URL을 입력하고 있습니다).

참고 URL : https://stackoverflow.com/questions/19304157/getting-the-reason-why-websockets-closed-with-close-code-1006

반응형