IOS

[IOS] Socket.IO를 사용한 Node.js 서버 연결 실패 이슈에 대하여

팀 프로젝트를 하면서 Swift 환경에서 소켓을 사용하기 위해 Socket.IO 라이브러리를 사용했다.

Socket.IO, 정확히 Socket.IO-Client-Swift는 Swift에서 Socket.IO로 만들어진 서버와 연결하기 위한 도구를 제공한다.

내 Socket.IO 버전은 15.2.0, 서버는 4.4.1 이었는데 서버와 연결을 시도하니 아래와 같은 메시지가 콘솔에 출력됐다.

SocketManager: masked and rsv data is not currently supported. code=1002, type=protocolError

 

처음엔 클라이언트 쪽의 transport(WebSocket, Polling) 또는 ATS 문제인 줄 알았으나 아니었다.

방법을 찾아보다가 결국 로컬로 서버를 옮겨와 다시 연결을 시도했으나 같은 오류 메시지가 출력됐다.

 

주변 지인의 도움으로 아래처럼 클라이언트 코드에 옵션을 추가했더니 이번엔 다른 오류 메시지가 출력됐다.

var manager = SocketManager(socketURL: URL(string: "ws://serverIP:8080")!, config: [
        .connectParams(["EIO" : "3"])
      ])
connection closed by server. code=1000, type=protocolError

 

위 메시지를 검색해보니 나와 같은 문제를 겪고 있는 사람이 있었다.

그 사람이 채택한 답변을 보면, Socket.IO-Client-Swift 15.2.0 버전의 경우 EIO(Engine.IO) parameter를 통해 서버에게 프로토콜 버전을 명시해주지 않기 때문에 오류가 생긴다는 것. 정확히 말하자면 클라이언트 쪽에서 parameter를 명시하지 않을 경우 서버에서는 기본적으로 클라이언트의 프로토콜 버전을 4로 인식한다고 한다. (서버 Socket.IO v4 부터 3으로 인식하게 픽스됐다.)

 

다른 답변에 링크된 문서를 찾아보니 서버 쪽에도 마찬가지로 allowEIO3: true 라는 속성을 추가해줘야했다.

Socket.IO의 공식문서에 따르면 구 버전(v2)의 Socket.IO를 사용하는 클라이언트와 최신 버전의 Socket.IO를 사용하는 서버를 호환가능하게 해주는 역할이라고 한다. 클라이언트 라이브러리를 16.0.0으로 업데이트하거나 서버의 버전을 낮추면 된다는 답변도 있었다.

 

결국은 서버와 클라이언트의 프로토콜 버전 차이 때문에 발생한 문제였고 위 속성을 추가해줌으로써 로컬에서는 해결이 가능했다.

그런데 로컬이 아닌 외부 서버에 연결을 시도했더니 똑같은 문제가 생겼고 라이브러리를 16.0.0으로 업데이트하여 해결했다.

(16.0.0 업데이트 로그에 v3 서버를 지원한다고 돼있는걸 보니 이전 버전은 v2 서버만 지원하는 것 같다. )

 

 

궁금해서 추가로 더 찾아본 결과, 공식문서와 socket.io-client-swift 깃허브 저장소의 이슈 항목에 관련 정보들이 잘 나와있었다.

 

참고 링크

https://github.com/socketio/socket.io/issues/3794

 

v2 compatibility mode not working on iOS · Issue #3794 · socketio/socket.io

Describe the bug After updating to socket.io 3.1.1 and setting allowEIO3: true, Android clients can connect as expected. However, iOS clients using Socket.IO-Client-Swift', '15.2.0' are...

github.com

https://github.com/socketio/engine.io/commit/868d89111de0ab5bd0e147ecaff7983afbf5d087

 

fix: set default protocol version to 3 (#616) · socketio/engine.io@868d891

socket.io-client-swift libs version <=15.2.0, which uses protocol version 3, do not explicitly add the EIO query parameter at transport initialization. This omission leads the server to treat th...

github.com

https://socket.io/docs/v4/migrating-from-3-x-to-4-0/#ensure-compatibility-with-swift-v15-clients

 

Migrating from 3.x to 4.0 | Socket.IO

The 4.0.0 release adds quite a lot of new features, which are detailed below, but it also contains a few API breaking changes (hence the major bump).

socket.io

https://github.com/socketio/socket.io-client-swift/blob/master/Usage%20Docs/Compatibility.md

 

GitHub - socketio/socket.io-client-swift

Contribute to socketio/socket.io-client-swift development by creating an account on GitHub.

github.com