[파이썬] socket `socketserver` 모듈 사용하기

Python에서 socketserver 모듈은 소켓 통신을 위한 편리한 기능을 제공합니다. 이 모듈은 서버를 만들고 클라이언트와의 통신을 처리하는데 도움이 되는 클래스와 메서드를 제공합니다.

SocketServer 클래스 소개

socketserver 모듈에는 여러 가지 서버 클래스가 있지만, 가장 일반적으로 사용되는 클래스는 SocketServer.TCPServerSocketServer.UDPServer입니다. 이 두 클래스는 각각 TCP와 UDP 소켓을 사용하는 서버를 생성할 수 있습니다.

from socketserver import TCPServer

# TCP 서버 생성
server = TCPServer(("localhost", 8080), MyTCPHandler)

# 클라이언트 요청을 받기 위해 서버 시작
server.serve_forever()

TCPServer 클래스의 첫 번째 매개변수는 서버의 주소와 포트를 나타내며, 두 번째 매개변수는 요청을 처리할 핸들러 클래스를 지정합니다.

BaseRequestHandler 클래스 상속

서버에서 요청을 처리하기 위해서는 BaseRequestHandler 클래스를 상속하여 개별적인 핸들러 클래스를 생성해야 합니다. 이 클래스는 handle 메서드를 구현해 클라이언트의 요청을 처리합니다.

from socketserver import BaseRequestHandler

class MyTCPHandler(BaseRequestHandler):
    def handle(self):
        # 클라이언트로부터 데이터 받기
        data = self.request.recv(1024)
        
        # 데이터 처리 로직 작성
        processed_data = self.process_data(data)
        
        # 클라이언트에게 데이터 전송
        self.request.sendall(processed_data)
    
    def process_data(self, data):
        # 데이터 처리 로직 작성
        return data.upper()

위 예제에서는 handle 메서드 내부에서 클라이언트로부터 데이터를 받아서 처리한 후, 다시 클라이언트에게 전송하는 간단한 예제를 보여줍니다. 실제로는 요청의 내용에 따라 다양한 작업을 수행할 수 있습니다.

서버 시작 및 요청 처리

핸들러 클래스를 작성한 후, 서버를 시작하고 클라이언트 요청을 처리할 준비가 되었습니다. 서버를 시작하고 클라이언트의 요청을 처리하는 부분은 다음과 같이 작성할 수 있습니다.

from socketserver import TCPServer, BaseRequestHandler

class MyTCPHandler(BaseRequestHandler):
    # 핸들러 클래스 코드

# TCP 서버 생성
server = TCPServer(("localhost", 8080), MyTCPHandler)

# 클라이언트 요청을 받기 위해 서버 시작
server.serve_forever()

이제 서버가 시작되면 클라이언트의 요청을 받아 핸들러 클래스의 handle 메서드에서 처리할 수 있습니다.

이렇게 socketserver 모듈을 사용하여 손쉽게 서버를 구축하고 클라이언트와의 통신을 처리할 수 있습니다. 실제로는 데이터의 암호화, 인증, 다중 클라이언트 지원 등 다양한 기능을 추가할 수 있으며, 보안과 성능을 고려하여 적절한 개발 방식을 선택할 수 있습니다.