공통프로젝트로 IoT 자동 운동 기록 서비스를 만들면서 서버와 클라이언트 간 통신 방법에 대해 고민이 생겼었다.

React Native를 바탕으로 만들어진 앱,React로 만들어진 웹페이지, 라즈베리파이...
다양한 Client를 Server로 양방향 통신을 하기 위해서 우리가 선택한 것은 Socket.IO였다.

Socket.IO를 선택하게 된 이유는 여러가지가 있었다.

  • 사용 경험이 있음
  • 서버로 사용하는 Node.js를 지원함
  • 우리 팀이 사용하는 모든 언어를 지원함


찾아봤던 라이브러리


라즈베리파이에서 내가 처음 사용하려고 한 라이브러리와 버전은 socketIO-client==0.7.2 이다.

이 client 라이브러리를 사용할 때 주의해야 할 점은 해당 라이브러리가 매우 오래된 라이브러리여서 socket.io 프로토콜 1.x만을 지원한다는 것이다.

그래서 server와 버전이 맞지 않아서 새로운 라이브러리를 탐색하게 되었다.


실제로 사용한 Python Socket.IO client

그래서 그 대안으로 찾게 된 client 라이브러리와 버전은
python-socketio==4.6.0이다.

출처

위에 써있는 내용을 보면 해당 라이브러리는 Python 3.6이상을 지원하고 Socket.IO 서버의 1.x와 2.x를 지원한다고 한다.

따라서 이 라이브러리를 사용할 때에는 해당하는 표를 참고하여 버전을 맞춰야 한다.

requirements.txt

...
python-engineio==3.14.2
python-engineio-client==1.1
python-socketio==4.6.0
...

따라서 나는 python-engineio의 버전을 3.x로 설치하였다.

room이나 namespace를 사용하지 않는 경우에서 client side에서의 Socket.IO 사용법은 매우 단순하다.

아래의 코드블럭은 해당 라이브러리 공식문서에 있는 예제이다.


import socketio

sio = socketio.Client()

@sio.event
def connect():
    print('connection established')

@sio.event
def my_message(data):
    print('message received with ', data)
    sio.emit('my response', {'response': 'my response'})

@sio.event
def disconnect():
    print('disconnected from server')

sio.connect('http://localhost:5000')
sio.wait()

socketio를 import하고 Client클래스를 가져와 사용한다.

sio.connect는 서버와 연결하기 위해 사용하는데 해당 함수가 받을 수 있는 인자를 살펴보면

def connect(self, url, headers={}, auth=None, transports=None,
                namespaces=None, socketio_path='socket.io', wait=True,
                wait_timeout=1):

기본적으로 url만을 필요로 함을 알 수 있다.
해당 함수에 작성되어 있는 주석을 살펴보면

#:param transports: The list of allowed transports. Valid transports
                   #are ``'polling'`` and ``'websocket'``. If not
                   #given, the polling transport is connected first,
                   #then an upgrade to websocket is attempted.

기본적으로는 polling으로 연결을 하고 그 후 websocket으로 연결을 시도함을 알 수 있다.

여기서 polling과 websocket의 차이점에 대해 얘기해보자면,


  • polling
    • 일정한 주기로 신호를 날려 이벤트 내용을 전달받음
    • 주기기 짧으면 서버의 부담이 심함
    • 주기가 길면 실시간으로 데이터가 업데이트 되지 않음
    • 구현 난이도가 낮음

  • websocket
    • 처음에는 HTTP를 이용해 연결하지만 연결이 정상적으로 되면 일정 시간후 HTTP연결이 끊어지고 웹소켓 연결만이 남아있음
    • 매우 빠르게 작동함
    • 간단한 기능만 있음

라고 할 수 있다.


다음 글에서는 이벤트의 사용에 대해 얘기해보려고 한다.

0개의 댓글