[python] 다중 클라이언트 연결 처리

인터넷 서비스나 네트워크 애플리케이션을 개발할 때, 다중 클라이언트 연결 처리는 중요한 과제입니다. 이 기술은 서버가 여러 클라이언트와 동시에 통신할 수 있도록 합니다.

보통 selectpoll 함수를 사용하여 이에 대한 처리를 합니다. 하지만 파이썬의 경우, select 모듈을 통해 이를 처리할 수 있습니다.

select 모듈

select 모듈은 소켓이나 파일 디스크립터 등 I/O 이벤트를 감지하기 위한 “멀티플렉싱” 기능을 제공합니다. 즉, 여러 개의 소켓(또는 파일 디스크립터)에 대해 읽기, 쓰기, 에러 등의 상태를 감지할 수 있게 해줍니다.

아래 예제는 select 모듈을 사용하여 여러 클라이언트의 연결을 동시에 처리하는 간단한 에코 서버를 구현한 것입니다.

import select
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 1234))
server_socket.listen(5)

inputs = [server_socket]

while inputs:
    readable, _, _ = select.select(inputs, [], [])
    for s in readable:
        if s is server_socket:
            client_socket, client_address = server_socket.accept()
            print(f'New connection from {client_address}')
            inputs.append(client_socket)
        else:
            data = s.recv(1024)
            if data:
                s.send(data)
            else:
                s.close()
                inputs.remove(s)

위의 예제는 주어진 소켓이 읽기 가능한 상태가 되면 select 메서드가 반환한 readable에 있는 클라이언트에 대해 데이터를 읽고 다시 보내는 간단한 에코 서버를 구현한 것입니다.

결론

select 모듈을 사용하면 비동기 I/O 처리를 통해 다중 클라이언트의 동시 접속 및 통신을 처리할 수 있습니다. 네트워크 애플리케이션을 개발할 때, 이러한 다중 클라이언트 연결 처리를 고려해 보는 것이 중요합니다.

참고 자료