RoBoLoG

[Python] python으로 socketio 서버와 클라이언트 만들기 본문

Study/Python

[Python] python으로 socketio 서버와 클라이언트 만들기

SKJun 2023. 6. 16. 16:33

 

socketio 서버와 클라이언트 만들기

 

1. python-socketio란?

  1. 양방향 통신: 클라이언트와 서버 간에 실시간, 양방향 통신을 가능하게 합니다.
  2. 이벤트 기반: 통신은 이벤트 기반으로 이루어지며, 특정 이벤트가 발생했을 때 콜백 함수를 실행합니다.
  3. 다양한 환경 지원: python-socketio는 순수 Python 서버 뿐만 아니라, Flask, Django 등의 웹 프레임워크와도 통합될 수 있습니다.
  4. 다중 전송 방식 지원: WebSocket을 주 전송 방식으로 사용하지만, 다른 전송 방식도 지원합니다. 이는 클라이언트가 WebSocket을 지원하지 않는 경우에도 연결을 유지할 수 있게 해줍니다.
  5. 자동 재연결 및 네트워크 복구: 클라이언트 라이브러리는 네트워크 연결이 끊어졌을 때 자동으로 재연결을 시도합니다.

 


2. python-socketio 설치

먼저, socketio 패키지를 설치해야 합니다. 다음 명령을 사용하여 설치할 수 있습니다:

pip install python-socketio

3. 서버 측 예시 코드 (server.py):

import socketio

# Socket.IO 서버 생성
sio = socketio.Server()

# 연결 이벤트 핸들러
@sio.event
def connect(sid, environ):
    print('클라이언트가 연결되었습니다:', sid)

# 메시지 이벤트 핸들러
@sio.event
def message(sid, data):
    print('클라이언트로부터 메시지 수신:', data)

# 실행할 때 웹 소켓 서버 시작
if __name__ == '__main__':
    app = socketio.WSGIApp(sio)
    socketio.server.SocketIOServer(('localhost', 8000), app).serve_forever()

 

  1. socketio 라이브러리 임포트: Socket.IO 서버 기능을 사용하기 위해 socketio 모듈을 임포트합니다.
  2. Socket.IO 서버 생성: socketio.Server()를 사용하여 Socket.IO 서버 인스턴스를 생성합니다.
  3. 연결 이벤트 핸들러: 클라이언트가 서버에 연결되면 실행되는 connect 이벤트 핸들러를 정의합니다. 클라이언트의 식별자(sid)와 환경 정보(environ)를 인자로 받습니다.
  4. 메시지 이벤트 핸들러: 클라이언트로부터 메시지를 받을 때 실행되는 message 이벤트 핸들러를 정의합니다. 클라이언트 식별자(sid)와 데이터(data)를 인자로 받습니다.
  5. 서버 실행: 서버 애플리케이션(socketio.WSGIApp(sio))을 생성하고, localhost의 8000번 포트에서 서버를 시작합니다. serve_forever()를 호출하여 서버가 계속 실행되도록 합니다.

4. 클라이언트 측 예시 코드 (client.py):

import socketio

# Socket.IO 클라이언트 생성
sio = socketio.Client()

# 연결 이벤트 핸들러
@sio.event
def connect():
    print('서버에 연결되었습니다.')

    # 서버로 메시지 전송
    sio.emit('message', '안녕하세요!')

# 메시지 이벤트 핸들러
@sio.event
def message(data):
    print('서버로부터 메시지 수신:', data)

# 서버에 연결
sio.connect('http://localhost:8000')

# 서버로부터 메시지 수신 대기
sio.wait()

 

  1. socketio 라이브러리 임포트: Socket.IO 클라이언트 기능을 사용하기 위해 socketio 모듈을 임포트합니다.
  2. Socket.IO 클라이언트 생성: socketio.Client()를 사용하여 Socket.IO 클라이언트 인스턴스를 생성합니다.
  3. 연결 이벤트 핸들러: 서버에 연결되면 실행되는 connect 이벤트 핸들러를 정의합니다. 서버에 연결되었다는 메시지를 출력하고, 서버로 '안녕하세요!'라는 메시지를 전송합니다.
  4. 메시지 이벤트 핸들러: 서버로부터 메시지를 받을 때 실행되는 message 이벤트 핸들러를 정의합니다. 수신한 데이터(data)를 출력합니다.
  5. 서버 연결: sio.connect('http://localhost:8000')를 호출하여 서버에 연결합니다.
  6. 메시지 수신 대기: sio.wait()를 호출하여 서버로부터의 메시지를 계속 기다립니다.

5. Python의 SocketIO를 언제 쓰면 좋을까?

  1. 실시간 통신이 필요한 경우: 채팅 애플리케이션, 실시간 알림, 실시간 데이터 업데이트 등 실시간으로 정보를 교환해야 하는 애플리케이션에 적합합니다.
  2. 양방향 통신이 중요한 경우: 클라이언트와 서버가 서로에게 동시에 데이터를 보내고 받아야 하는 경우에 유용합니다.
  3. 이벤트 기반 프로그래밍이 필요한 경우: 특정 이벤트에 따라 서버와 클라이언트가 상호작용해야 할 때, Socket.IO의 이벤트 기반 통신 방식이 적합합니다.
  4. 다양한 클라이언트와의 호환성이 요구되는 경우: Socket.IO는 다양한 플랫폼 및 장치에서 실행되는 클라이언트와 호환됩니다. 웹 브라우저, 모바일 앱 등 다양한 클라이언트와의 통신이 필요한 경우 유용합니다.
  5. WebSocket이 주된 통신 방식이지만 대체 방식도 필요한 경우: WebSocket을 지원하지 않는 환경에서도 작동할 수 있도록 폴링과 같은 대체 전송 방식을 지원합니다.
  6. 네트워크 중단이나 연결 문제에 대한 내성이 필요한 경우: 자동 재연결 기능을 통해 네트워크 연결이 끊어진 경우에도 클라이언트가 서버에 재연결을 시도하게 할 수 있습니다.
  7. 멀티플랫폼/멀티서버 환경에서의 사용: Flask, Django와 같은 Python 웹 프레임워크와 함께 사용하거나, 다중 서버 환경에서도 구현할 수 있습니다.

이러한 특성들로 인해 python-socketio는 실시간 통신이 중요한 다양한 웹 및 모바일 애플리케이션, 대화형 서비스, 게임, 협업 도구 등에 적합하며, 다양한 사용자 상호작용을 필요로 하는 애플리케이션 개발에 유용하게 사용될 수 있습니다.

728x90
반응형