[파이썬] 소켓 프로그래밍과 멀티스레딩

소켓 프로그래밍

소켓 프로그래밍은 네트워크 상에서 컴퓨터 간에 데이터를 주고받기 위해 사용되는 방법입니다. 소켓은 프로세스 간에 통신을 가능하게 해주는 추상화된 인터페이스입니다. 소켓을 사용하면 클라이언트와 서버 사이에 TCP 혹은 UDP 연결을 생성하고 관리할 수 있습니다.

Python은 소켓 프로그래밍을 위한 socket 모듈을 제공합니다. 이 모듈을 사용하면 간단하게 소켓을 생성하고 데이터를 주고받을 수 있습니다.

예를 들어, 다음은 간단한 TCP 클라이언트 코드입니다:

import socket

server_address = ('localhost', 8888)

# 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버에 연결
client_socket.connect(server_address)

try:
    # 데이터 전송
    message = "Hello, Server!"
    client_socket.sendall(message.encode())
    
    # 데이터 수신
    data = client_socket.recv(1024)
    print("Received:", data.decode())
    
finally:
    # 소켓 종료
    client_socket.close()

위 코드에서 socket.AF_INET은 IPv4 주소 체계를 사용한다는 의미이고, socket.SOCK_STREAM은 TCP 소켓을 생성한다는 의미입니다. connect() 함수를 사용하여 서버에 연결한 다음, sendall() 함수로 데이터를 전송하고, recv() 함수로 데이터를 수신합니다.

멀티스레딩

멀티스레딩은 하나의 응용 프로그램에서 여러 개의 스레드를 동시에 실행하는 것을 말합니다. 이는 CPU 시간을 효율적으로 활용하고 병렬 처리를 가능하게 합니다.

Python은 멀티스레딩을 위한 threading 모듈을 제공합니다. 이 모듈을 사용하면 간단하게 스레드를 생성하고, 동기화와 공유자원 문제를 해결할 수 있습니다.

예를 들어, 다음은 간단한 멀티스레드 서버 코드입니다:

import socket
import threading

def handle_client(client_socket):
    try:
        # 데이터 수신
        data = client_socket.recv(1024)
        print("Received:", data.decode())
        
        # 데이터 전송
        message = "Hello, Client!"
        client_socket.sendall(message.encode())
    finally:
        # 클라이언트 소켓 종료
        client_socket.close()

# 서버 주소
server_address = ('localhost', 8888)

# 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 포트에 바인딩
server_socket.bind(server_address)

# 연결 대기
server_socket.listen(5)
print("Server is listening on", server_address)

while True:
    # 클라이언트 연결 수락
    client_socket, client_address = server_socket.accept()
    print("Connected with", client_address)
    
    # 클라이언트 처리를 위한 스레드 생성
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start()

위 코드에서 handle_client() 함수는 각 클라이언트 요청을 처리하는 역할을 합니다. Thread 클래스를 사용하여 클라이언트 요청마다 새로운 스레드를 생성하고, start() 함수를 호출하여 스레드를 실행합니다.

요약

소켓 프로그래밍과 멀티스레딩은 네트워크 프로그래밍에서 중요한 개념입니다. Python은 socket 모듈과 threading 모듈을 제공하여 소켓 프로그래밍과 멀티스레딩을 쉽게 구현할 수 있습니다. 이를 활용하여 다양한 네트워크 응용 프로그램을 개발할 수 있습니다.