P2P(Peer-to-Peer) 네트워크는 중앙 서버 없이 컴퓨터들이 서로 직접 연결되어 정보를 교환하는 방식의 네트워크입니다. P2P 네트워크는 파일 공유, 채팅, 게임 등 다양한 분야에서 활용됩니다.
P2P 네트워크에서는 모든 노드가 서버와 클라이언트 역할을 동시에 수행합니다. 즉, 모든 노드가 서로에게 데이터를 주고받을 수 있도록 서버와 클라이언트의 역할을 수행합니다. 이러한 방식으로 중앙 서버 없이 모든 노드가 분산적으로 데이터를 주고받을 수 있게 됩니다.
P2P 네트워크는 일반적으로 다음과 같은 작동 원리를 가집니다:
- 노드 검색: P2P 네트워크에 새로운 노드가 참가하면, 이 노드는 네트워크의 다른 노드를 검색합니다.
- 노드 연결: 새로운 노드는 검색된 노드 중에서 연결할 노드를 선택하고, 그 노드와 직접 연결합니다.
- 정보 교환: 노드 간에는 정보를 교환할 수 있습니다. 이를 위해 파일 공유, 채팅, 게임 등 다양한 프로토콜을 사용할 수 있습니다.
P2P 네트워크 연결을 위해서는 서버와 클라이언트를 구분하지 않고, 모든 노드가 서로를 클라이언트와 서버로서 연결해야 합니다. 이를 위해 각 노드에서 서버 소켓과 클라이언트 소켓을 모두 생성하고, 서버 소켓으로부터 들어오는 연결을 받아들이는 쓰레드와, 클라이언트 소켓으로 다른 노드에 연결하는 쓰레드를 각각 생성해야 합니다.
import socket
import threading
# 서버 정보
SERVER_HOST = "localhost"
SERVER_PORT = 9999
# 클라이언트 정보
CLIENT_HOST = "localhost"
CLIENT_PORT = 8888
def handle_client(client_socket):
while True:
# 클라이언트로부터 데이터 수신
data = client_socket.recv(1024)
if not data:
break
# 데이터 처리
print("Received:", data.decode())
# 데이터 송신
client_socket.sendall(data)
# 클라이언트 소켓 종료
client_socket.close()
# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen()
# 클라이언트 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.bind((CLIENT_HOST, CLIENT_PORT))
client_socket.listen()
while True:
# 클라이언트 연결 대기
client_socket, client_addr = server_socket.accept()
# 클라이언트 쓰레드 생성
thread = threading.Thread(target=handle_client, args=(client_socket,))
thread.start()
# 다른 클라이언트와 연결
peer_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
peer_socket.connect((client_addr[0], CLIENT_PORT))
# 피어 쓰레드 생성
peer_thread = threading.Thread(target=handle_client, args=(peer_socket,))
peer_thread.start()
