[python] aiohttp 서버와 클라이언트 간의 WebSocket 통신 구현

WebSocket은 실시간으로 양방향 통신을 가능하게 하는 프로토콜입니다. aiohttp는 Python에서 아주 강력한 웹 프레임워크인데, aiohttp를 사용하여 서버와 클라이언트 간에 WebSocket 통신을 구현하는 방법에 대해 알아보겠습니다.

aiohttp 서버에서 WebSocket 핸들링

먼저 aiohttp 서버에서 WebSocket을 핸들링하는 방법을 알아보겠습니다. 아래는 aiohttp 서버에서 WebSocket을 핸들링하는 간단한 예제입니다.

from aiohttp import web

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    
    async for msg in ws:
        if msg.type == web.WSMsgType.TEXT:
            await ws.send_str('You sent: {}'.format(msg.data))
        elif msg.type == web.WSMsgType.ERROR:
            print('WebSocket connection closed with exception {}'.format(ws.exception()))
            
    return ws

app = web.Application()
app.router.add_get('/websocket', websocket_handler)

web.run_app(app)

위 코드에서 websocket_handler 함수는 /websocket 경로로 WebSocket 연결을 핸들링하는 역할을 합니다. WebSocket 객체를 만들고, 연결을 준비한 다음 클라이언트로부터 메시지를 받아서 그대로 다시 보내는 간단한 예제입니다.

aiohttp 클라이언트에서 WebSocket 연결

다음으로 aiohttp 클라이언트에서 aiohttp 서버에 WebSocket 연결을 하는 방법을 알아보겠습니다. 아래는 aiohttp 클라이언트에서 aiohttp 서버에 WebSocket 연결을 하는 간단한 예제입니다.

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.ws_connect('http://localhost:8080/websocket') as ws:
            await ws.send_str('Hello, server!')
            async for msg in ws:
                if msg.type == aiohttp.WSMsgType.TEXT:
                    print('Received message: {}'.format(msg.data))
                elif msg.type == aiohttp.WSMsgType.CLOSED:
                    break
                elif msg.type == aiohttp.WSMsgType.ERROR:
                    print('WebSocket connection closed with exception {}'.format(ws.exception()))
                    break

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

위 코드에서 main 함수에서 aiohttp.ClientSession을 생성하고 session.ws_connect를 통해 WebSocket 연결을 생성합니다. 그리고 메시지를 보내고 받는 부분을 구현합니다. 코드를 실행하면 Hello, server! 메시지를 서버로 보내고 서버로부터 오는 메시지를 출력하게 됩니다.

결론

Aiohttp는 WebSocket을 사용하여 서버와 클라이언트 간에 실시간 양방향 통신을 쉽게 구현할 수 있도록 도와줍니다. 위의 예제 코드를 참고하여 aiohttp를 통해 WebSocket을 핸들링하는 뛰어난 기능을 활용해보세요.