관리 메뉴

Joonas' Note

socket.io 연결 실패 해결하기 본문

개발

socket.io 연결 실패 해결하기

joonas 2018. 7. 23. 02:52

node.js + socket.io로 간단하게 실시간 이벤트 서버를 만들려고 했다.

약 3~4년 전에 비슷한 개발을 해봤기에 무리없이 될거라고 생각했으나, 하루종일 삽질했다. 서버단과 클라이언트단의 코드 모두 공식 도큐먼트로 작성하였으니 틀릴리가 없었다. 첨부하자면 아래와 같다.

페이지가 로드되면 서버에 연결을 시도하고, 연결되면 test 후 종료하는 테스트 코드이다. 근데 서버쪽에서는 엄청나게 많은 연결이 시도되고 있었다. (서버쪽 화면이 connected!로 도배되고 있었다.)
하지만 이게 웬, 정작 클라이언트쪽 socket 변수의 connected 속성은 false였다.

참고로 express는 v4.16.3, socket.io는 v2.1.1, node.js는 v10.6.0 이었다.

결론은, 아래 한 줄로 해결되었다.

transport 속성을 생략하면 기본적으로 'polling'이 설정되는 것일까? 서버단의 로그가 도배된 이유가 납득이 된다.

참고한 글

[GIthub] socketio/socket.io-client - XHR Polling Error appears when debugger is present #1097

6 Comments
  • 프로필사진 초개 2019.05.29 19:03 와 진짜 저도 하루종일 삽질하고있었는데 정말 감사합니다!!
  • 프로필사진 joonas 2019.05.30 03:03 신고 도움이 되셨다니 다행이네요. 댓글 감사합니다 ㅎㅎ
  • 프로필사진 tomato 2019.12.17 14:00 저도 이 방법으로 해결되었습니다. 다만, 제 경우에는 connection과 disconnect 이벤트가 여러 번 발생하다가 어느 순간 연결이 안정화? 되는 것처럼 보이는 현상이 일어났습니다.
    조사해본 결과 확실하지 않지만 우선 기본적인 io.connect 함수 옵션이 처음에 먼저 polling으로 시도하고 그 다음 websocket으로 업그레이드? (이런 표현을 쓰는 것 같았습니다.) 되는 방식인 것 같습니다.
    실험 결과 저의 경우는 명시적으로 polling 옵션일 경우는 연결이 전부 실패하고 websocket 옵션일 때는 문제 없이 연결에 성공하였습니다. 이 때 연결 실패 메시지가 400 에러가 발생해서 server 코드에서 socketio = require("socket.io") 로 초기화 한 후 server에 필요한 이벤트 핸들러를 전부 등록하고 그 다음 io = socketio.listen(server) 방식으로 코드의 순서를 바꾸니 polling 옵션에서도 해결이 되었습니다. 사실 해결을 하고 나서도 왜 xhr-polling은 안되고 websocket은 코드를 바꾸지 않아도 연결에 성공하는지 잘 이해가 되지는 않네요..
  • 프로필사진 joonas 2019.12.19 13:17 신고 추측대로 기본값이 polling 이었군요..
    직접 실험까지 해보셨다니 대신 감사드립니다. 말씀을 들어보니 클라이언트 코드는 문제가 없고, 서버에서 socketio 모듈을 사용할 때 인스턴스에서 listen 메소드를 명시적으로 호출하는 게 옳은가봅니다.
    공식 도큐먼트의 코드를 사용한건데 참 억울하네요?!
    그리고, require의 동작 원리가 제가 생각하는 것과 조금 달랐네요. 왠지 이것도 이유 중 하나일 것 같은데, 도움이 될까 싶어 링크 공유합니다 ㅎㅎ
    https://jongmin92.github.io/2017/07/13/Node/require/
  • 프로필사진 백앤드 2020.04.02 19:34 덕분에 해결했네요
    감사합니다
  • 프로필사진 joonas 2020.04.04 02:16 신고 다행이네요 :)
댓글쓰기 폼