[파이썬] Tornado에서의 웹소켓 사용

Tornado는 Python으로 작성된 비동기 웹 프레임워크로, 높은 처리량과 확장성을 제공합니다. 이에 더해, Tornado는 웹소켓을 지원하여 실시간 양방향 통신을 구현할 수 있습니다. 이번 블로그 포스트에서는 Tornado에서 웹소켓을 어떻게 사용하는지 알아보겠습니다.

Tornado 웹소켓 모듈

Tornado에서 웹소켓을 사용하려면 tornado.websocket 모듈을 import 해야합니다.

import tornado.websocket

웹소켓 핸들러 클래스

Tornado에서 웹소켓을 다루기 위해 사용되는 핵심 개념은 웹소켓 핸들러 클래스입니다. 이 클래스는 tornado.websocket.WebSocketHandler를 상속받아 구현됩니다.

class MyWebSocketHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print("WebSocket connection opened")

    def on_message(self, message):
        print(f"Received message: {message}")

    def on_close(self):
        print("WebSocket connection closed")

위의 예제에서는 open, on_message, on_close 메서드를 오버라이드하여 웹소켓 연결, 메시지 수신, 연결 종료 이벤트를 처리하고 있습니다.

웹소켓 라우팅

Tornado에서 웹소켓을 사용하려면 웹소켓 라우팅을 설정해야 합니다. 웹소켓 라우팅은 URL 패턴과 웹소켓 핸들러 클래스를 연결하는 역할을 합니다.

app = tornado.web.Application([
    (r"/ws", MyWebSocketHandler),
])

위의 예제에서는 /ws URL에 접속한 클라이언트를 MyWebSocketHandler에 연결합니다.

Tornado 웹소켓 서버 실행

이제 Tornado 웹소켓 서버를 실행해보겠습니다.

if __name__ == "__main__":
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위의 코드에서는 app.listen(8888) 메서드를 통해 Tornado 웹소켓 서버를 8888 포트에서 실행합니다. 마지막으로 tornado.ioloop.IOLoop.current().start()을 호출하여 이벤트 루프를 실행합니다.

웹소켓 클라이언트

마지막으로, Tornado 웹소켓 서버와 통신하기 위해 웹소켓 클라이언트를 사용해보겠습니다. 아래 예제는 Python websocket 모듈을 사용한 웹소켓 클라이언트 코드입니다.

import websocket

def on_message(ws, message):
    print(f"Received message: {message}")

def on_error(ws, error):
    print(f"Error: {error}")

def on_close(ws):
    print("WebSocket connection closed")

def on_open(ws):
    print("WebSocket connection opened")

if __name__ == "__main__":
    ws = websocket.WebSocketApp("ws://localhost:8888/ws",
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()

위의 예제는 websocket.WebSocketApp을 사용하여 웹소켓 클라이언트를 생성하고, on_message, on_error, on_close, on_open 콜백 함수를 등록하고 있습니다. ws.run_forever()를 호출하여 웹소켓 클라이언트를 실행합니다.

결론

이번 블로그 포스트에서는 Tornado에서 웹소켓을 사용하는 방법을 알아보았습니다. Tornado의 강력한 비동기 기능과 함께 웹소켓을 활용하여 실시간 통신을 구현할 수 있습니다. Tornado를 사용하여 웹 소켓 기반 애플리케이션을 만들어보는 것을 추천드립니다. Happy coding!