[파이썬] aiohttp 비동기 웹소켓 처리하기

aiohttp is a powerful asynchronous web framework for Python that allows you to efficiently handle various web protocols, including websockets. Websockets provide a full-duplex communication channel over a single TCP connection, enabling real-time communication between the server and the client.

In this blog post, we will explore how to handle websocket communication using aiohttp in an asynchronous manner. We will cover the following topics:

  1. Installing aiohttp
  2. Setting up the aiohttp server
  3. Handling websocket connections
  4. Sending and receiving messages
  5. Closing websocket connections

Let’s get started!

1. Installing aiohttp

To use aiohttp, we first need to install it. Open your terminal and run the following command:

pip install aiohttp

Make sure you have Python and pip installed on your system.

2. Setting up the aiohttp server

To create an aiohttp server that can handle websocket connections, we need to import the required modules and create an application object. Here’s an example of how to set up an aiohttp server:

import aiohttp
from aiohttp import web

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    # handle websocket connection logic here

    return ws

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

web.run_app(app)

In the above code, we define the websocket_handler function that is responsible for handling incoming websocket connections. We create a WebSocketResponse object and call its prepare method to prepare the websocket for communication.

3. Handling websocket connections

Inside the websocket_handler function, we can perform any necessary logic for handling websocket connections. For example, we can use a loop to continuously receive and send messages. Here’s an example of handling a websocket connection:

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            await ws.send_str(f'Received: {msg.data}')
        elif msg.type == aiohttp.WSMsgType.ERROR:
            break

    return ws

In this example, we use an async for loop to iterate over incoming messages from the client. We check the type of the message and perform different actions accordingly. If the message is of type TEXT, we send a response back to the client by calling ws.send_str.

4. Sending and receiving messages

To send messages from the server to the client, we can use the send_str or send_bytes methods of the WebSocketResponse object. Similarly, to receive messages from the client, we can use the receive method. Here’s an example of sending and receiving messages:

message = 'Hello, client!'
await ws.send_str(message)

response = await ws.receive()
if response.type == aiohttp.WSMsgType.TEXT:
    print(f'Received from client: {response.data}')

In this example, we send a string message to the client using the send_str method. Then, we await the response from the client using the receive method. We check the type of the response and print it if it is of type TEXT.

5. Closing websocket connections

To close the websocket connection, we can use the close method of the WebSocketResponse object. Here’s an example:

await ws.close()

This will gracefully close the connection between the server and the client.

That’s it! Now you have a basic understanding of how to handle websocket communication using aiohttp in Python. Feel free to explore more advanced features of aiohttp to build robust and efficient web applications.

I hope you found this blog post helpful. Happy coding with aiohttp!