공통프로젝트로 IoT 자동 운동 기록 서비스를 만들면서 서버와 클라이언트 간 통신 방법에 대해 고민이 생겼었다.
React Native를 바탕으로 만들어진 앱,React로 만들어진 웹페이지, 라즈베리파이...
다양한 Client를 Server로 양방향 통신을 하기 위해서 우리가 선택한 것은 Socket.IO였다.
Socket.IO를 선택하게 된 이유는 여러가지가 있었다.
라즈베리파이에서 내가 처음 사용하려고 한 라이브러리와 버전은 socketIO-client==0.7.2
이다.
이 client 라이브러리를 사용할 때 주의해야 할 점은 해당 라이브러리가 매우 오래된 라이브러리여서 socket.io 프로토콜 1.x만을 지원한다는 것이다.
그래서 server와 버전이 맞지 않아서 새로운 라이브러리를 탐색하게 되었다.
그래서 그 대안으로 찾게 된 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의 차이점에 대해 얘기해보자면,
다음 글에서는 이벤트의 사용에 대해 얘기해보려고 한다.