프로그래밍/C, C++, Java, Python

[Python] 파이썬 Socket.IO 오류 unexpected response code 400

포도알77 2021. 1. 16. 22:14

0. 선 요약

 - python-socket.io와 node.js socket.io간 버전 의존성이 있음.

 - python-socket.io v5, node.js socket.io v2로 낮춰서 통신 수행

 - python과 node간 socket 통신은 가능하다.

 

1. 상황

 (1) 서로 떨어진 Node.js와 Python간의 통신을 Socket.Io로 수행.

 (2) Node.js (서버) socket.io와 Python (client) socket.io 통신시 unexpected respnse code 400 또는 요청이 씹히는 경우가 발생.

 (3) Connection Refused-연결 거부(서버가 꺼져있는 등의 이유로)가 아님

 (4) 기존 프로토타입 테스트때 Python-Node간 통신이 가능함을 확인함

 

2. unexpected response code: 400

 400번대 오류로 클라이언트단에서 잘못된 요청을 서버로 전달하여 반환되는 에러다. 구글링을 열심히 해보면 CORS나 여러 답변들이 있다. 

 

 처음에는 클라이언트(python)에서 커넥션 자체를 만들지 못하여 (1)클라이언트측 코드 문제인지 아니면 (2) 네트워크 문제인지 찾아 헤메었다.

 

3. Socket.io 

 Python과 Node.js의 Socket.io가 이름이 동일해서 똑같은 줄 알았는데, 프로토콜별 버전 마킹부터 모든게 다 상이하다.

우선 정상 테스트된 Node.js 소켓 버전은 1.0.0이었고, 이를 npm update를 통해 최신버전으로 업그레이드하면 "unexpected response code: 400"이 발생했다.

 

구글링 해보니, python-socket.io와 node.js socket.io간 버전 의존성이 있었다. github 질문 스레드에서 python-socket.io 5버전과 node.js socket.io 3버전을 사용하면 된다고 하여, 현재 두 패키지의 최종 버전인 5버전, 3버전을 업그레이드 하였으나 문제는 달라지지 않았다.

 

 여러번 삽질 끝에 python-socket.io 5버전에서는 아직 socket.io 3버전 프로토콜을 지원하지 않는다고 적혀있었다. (레퍼런스를 찾아보지 않은 죄)

 

4. 해결책

 socket.io 3버전에 맞는 python-socket.io가 없으므로, python-socket.io는 5버전을 쓰고 node.js의 socket.io 버전을 낮춰야 한다.

 

 socket.io 버전은 2버전대로 낮추고 나면, express-socket.io-session 같은 패키지에서 의존성 에러들이 발생한다. 여기서 나는 그냥 제일 옛날 버전으로 낮춰버렸다.

 

5. 기타 정보

 python-socket.io에서 디버깅을 위하여 로거를 enable하는 코드

import socketio
sio = socketio.Client(logger=True, engineio_logger=True)

python PIP에서 원하는 버전의 패키지를 받는 방법

pip install python-socket.io==9.9.9

Node.js npm에서 해당 패키지의 가능한 모든 버전 확인하는 방법

npm view express-socket.io-session versions
페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사