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

소개

P2P(Peer-to-Peer) 소켓 프로그래밍은 네트워크를 통해 파일 및 데이터를 서로 공유하는 분산 시스템의 개념입니다. 이 개념은 중앙 집중형 서버를 사용하지 않고, 서로 동등한 역할을 하는 여러 개의 컴퓨터(피어)가 데이터를 주고 받으며 협업하는 방식을 의미합니다. 이 글에서는 Python을 사용하여 간단한 P2P 소켓 프로그래밍을 구현하는 방법을 알아보겠습니다.

필요한 라이브러리 설치

Python에서 P2P 소켓 프로그래밍을 구현하기 위해 socketthreading 라이브러리를 사용합니다. 이 두 가지 모듈은 이미 Python 표준 라이브러리에 포함되어 있기 때문에 별도의 설치 과정은 필요하지 않습니다.

import socket
import threading

P2P 소켓 프로그래밍 구현

1. 서버 구현

먼저 P2P 소켓 프로그래밍의 서버 부분을 구현해보겠습니다. 서버는 클라이언트의 연결 요청을 받아들이고 데이터를 전달하는 역할을 담당합니다. 다음은 간단한 P2P 서버의 예시 코드입니다.

def handle_client(client_socket, client_address):
    while True:
        # 클라이언트로부터 데이터를 수신
        data = client_socket.recv(1024)
        if not data:
            break
        
        # 수신한 데이터를 다른 연결된 클라이언트에게 전송
        for peer_socket, peer_address in connected_peers:
            if peer_socket != client_socket:
                peer_socket.send(data)
    
    # 연결 종료
    client_socket.close()
    connected_peers.remove((client_socket, client_address))

def start_server(port):
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('', port))
    server_socket.listen(5)
    
    while True:
        client_socket, client_address = server_socket.accept()
        connected_peers.append((client_socket, client_address))
        
        # 새로운 클라이언트를 처리하기 위한 스레드 생성
        client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
        client_thread.start()

2. 클라이언트 구현

다음으로 P2P 소켓 프로그래밍의 클라이언트 부분을 구현해보겠습니다. 클라이언트는 서버에 연결하여 데이터를 보내고, 다른 클라이언트로부터 받은 데이터를 수신하는 역할을 담당합니다. 다음은 간단한 P2P 클라이언트의 예시 코드입니다.

def handle_server(server_socket):
    while True:
        # 서버로부터 데이터를 수신
        data = server_socket.recv(1024)
        if not data:
            break
        
        # 수신한 데이터를 출력
        print(f'Received data: {data.decode()}')

def connect_to_server(server_ip, server_port):
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.connect((server_ip, server_port))
    
    # 서버로부터 데이터를 처리하기 위한 스레드 생성
    server_thread = threading.Thread(target=handle_server, args=(server_socket,))
    server_thread.start()
    
    while True:
        # 사용자로부터 입력을 받아 서버로 전송
        message = input('Enter message: ')
        server_socket.send(message.encode())

# 클라이언트 실행
connect_to_server('127.0.0.1', 5000)

결론

이상으로 P2P 소켓 프로그래밍을 구현하는 방법을 알아보았습니다. Python의 socketthreading 라이브러리를 사용하여 간단한 P2P 네트워크를 구축할 수 있습니다. P2P 소켓 프로그래밍은 중앙 집중형 서버에 의존하지 않고 데이터를 공유하는 분산 시스템을 구현하고자 할 때 유용한 개념입니다. 실제로 P2P 네트워크를 구현할 때에는 보안 등의 추가 고려사항을 고려해야 하지만, 이 글을 통해 기본적인 개념과 구현 방법을 학습할 수 있습니다.

참고 자료: