[파이썬] 소켓 프로그래밍 패턴

소켓 프로그래밍 패턴이란?

소켓 프로그래밍은 네트워크 통신을 위해 사용되는 일반적인 프로그래밍 패턴입니다. 소켓을 사용하여 클라이언트와 서버 간에 데이터를 교환하는 소프트웨어를 개발하는 것을 의미합니다. 소켓 프로그래밍은 다양한 네트워크 프로토콜과 관련된 기능을 제공하며, 서로 다른 컴퓨터 또는 장치 간의 통신을 가능하게 합니다.

Python은 소켓 프로그래밍을 지원하는 강력한 도구인 socket 모듈을 제공합니다. 이 모듈을 사용하여 손쉽게 클라이언트와 서버를 구현할 수 있습니다. 아래에서는 몇 가지 소켓 프로그래밍 패턴을 살펴보겠습니다.

1. TCP 클라이언트-서버 패턴

TCP(Client-Server) 패턴은 클라이언트와 서버 간에 안정적인 연결을 설정하여 데이터를 교환하는 방식입니다. 이 패턴은 socket.socket()을 사용하여 서버와 클라이언트 간의 소켓 연결을 설정합니다. 서버는 socket.bind() 메서드를 호출하여 특정 포트에 바인딩하고, socket.listen() 메서드를 호출하여 클라이언트의 연결을 기다립니다. 클라이언트는 socket.connect() 메서드를 사용하여 서버에 연결합니다.

import socket

# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen()

# 클라이언트 연결 수락
client_socket, addr = server_socket.accept()
print(f"클라이언트가 연결되었습니다. 주소: {addr}")

# 클라이언트와 데이터 교환
data = client_socket.recv(1024)
client_socket.sendall("서버로부터 응답: {data}".encode("utf-8"))

# 연결 종료
client_socket.close()
server_socket.close()

2. UDP 클라이언트-서버 패턴

UDP(Client-Server) 패턴은 전송 속도가 중요한 실시간 애플리케이션에 적합한 방식입니다. UDP는 비연결형 프로토콜이므로 특정 연결 없이 데이터를 보내고 받을 수 있습니다.

import socket

# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 12345))

while True:
    # 데이터 수신
    data, addr = server_socket.recvfrom(1024)
    print(f"클라이언트로부터 받은 데이터: {data.decode('utf-8')}")

    # 데이터 송신
    response = "서버로부터 응답"
    server_socket.sendto(response.encode("utf-8"), addr)

# 소켓 닫기
server_socket.close()

3. 멀티스레드 패턴

소켓 프로그래밍에서는 동시에 여러 클라이언트와 통신해야할 때가 있습니다. 이때 멀티스레드 패턴을 사용하면 효율적인 동시성을 달성할 수 있습니다.

import socket
import threading

def handle_client(client_socket, addr):
    # 클라이언트와 데이터 교환
    data = client_socket.recv(1024)
    client_socket.sendall("서버로부터 응답: {data}".encode("utf-8"))

    # 연결 종료
    client_socket.close()

# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen()

while True:
    # 클라이언트 연결 수락
    client_socket, addr = server_socket.accept()
    print(f"클라이언트가 연결되었습니다. 주소: {addr}")

    # 새 스레드 생성과 시작
    client_thread = threading.Thread(target=handle_client, args=(client_socket, addr))
    client_thread.start()

위에서는 몇 가지 일반적인 소켓 프로그래밍 패턴을 살펴보았습니다. 이러한 패턴을 사용하여 네트워크 애플리케이션을 개발하면 다양한 상황에서 안정적인 통신을 구현할 수 있습니다.