한국어 번역
안녕하세요, 미래의 파이썬 마법사 여러분! 오늘 우리는 소켓 프로그래밍의 흥미로운 세계로 접수합니다. 새로운 것에 대한 걱정은 하지 마세요; 우리는 기본부터 차근차근 시작해 나갈 것입니다. 이 튜토리얼의 끝을 맞아서, 여러분은 프로처럼 자신만의 네트워크 애플리케이션을 만들 수 있을 것입니다!
소켓은 무엇인가요?
멀리 떨어져 사는 친구에게 이야기하려고 할 때, 메시지를 보내고 그들의 답을 받을 방법이 필요합니다. 컴퓨터 세계에서 소켓은 이 역할을 합니다. 이들은 컴퓨터 간 통신을 가능하게 하는 전화선과 같습니다.
소켓은 네트워크에서 실행 중인 두 개의 프로그램 간의 양방향 통신 연결의 종단점입니다. 이들은 클라이언트(예: 웹 브라우저)와 서버(예: 웹사이트) 간에 메시지를 보내는 방법입니다.
파이썬 소켓 모듈
파이썬은 내장된 socket
모듈을 통해 소켓 프로그래밍을 쉽게 만들어줍니다. 먼저 이를 임포트해 보겠습니다:
import socket
이 간단한 줄이 우리에게 필요한 모든 소켓 기능에 접근할 수 있게 해줍니다. 마치 도구 상자를 열어 시작하기 전에!
서버 소켓 메서드
서버를 만들 때 특정 메서드를 사용해 설정해야 합니다. 다음은 가장 일반적인 서버 소켓 메서드 표입니다:
메서드 | 설명 |
---|---|
socket() |
새 소켓 생성 |
bind() |
소켓을 특정 주소와 포트에 바인딩 |
listen() |
서버를 리스닝 모드로 설정 |
accept() |
클라이언트의 연결을 수락 |
이를 간단한 예제로 보겠습니다:
import socket
# 소켓 객체 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 소켓을 특정 주소와 포트에 바인딩
server_socket.bind(('localhost', 12345))
# 들어오는 연결을 대기
server_socket.listen(1)
print("서버가 리스닝 중입니다...")
# 연결 수락
client_socket, address = server_socket.accept()
print(f"{address}에서 온 연결이 설정되었습니다!")
# 연결 닫기
client_socket.close()
이 예제에서 우리는 소켓을 생성하고 'localhost'의 12345 포트에 바인딩한 후, 리스닝을 시작하고 클라이언트의 연결을 기다립니다. 연결이 설정되면 메시지를 출력하고 연결을 닫습니다.
클라이언트 소켓 메서드
이제 클라이언트 쪽을 살펴보겠습니다. 클라이언트를 만들 때 사용하는 주요 메서드는 다음과 같습니다:
메서드 | 설명 |
---|---|
socket() |
새 소켓 생성 |
connect() |
지정된 주소의 원격 소켓에 연결 |
send() |
연결된 소켓으로 데이터 전송 |
recv() |
연결된 소켓으로부터 데이터 수신 |
간단한 클라이언트 예제를 보겠습니다:
import socket
# 소켓 객체 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버에 연결
client_socket.connect(('localhost', 12345))
print("서버와 연결되었습니다!")
# 연결 닫기
client_socket.close()
이 클라이언트는 소켓을 생성하고 서버에 연결한 후, 연결을 닫습니다.
파이썬 - 소켓 서버
서버 예제를 확장하여 실제로 유용한 작업을 수행하겠습니다:
import socket
def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("서버가 리스닝 중입니다...")
while True:
client_socket, address = server_socket.accept()
print(f"{address}에서 온 연결이 설정되었습니다!")
message = "서버에 오신 것을 환영합니다!"
client_socket.send(message.encode())
client_socket.close()
start_server()
이 서버는 계속 실행되며, 연결을 수락하고 환영 메시지를 보내고 연결을 닫습니다.
파이썬 - 소켓 클라이언트
이제 서버의 메시지를 수신할 수 있는 클라이언트를 만들어 보겠습니다:
import socket
def start_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
message = client_socket.recv(1024).decode()
print(f"서버로부터 메시지: {message}")
client_socket.close()
start_client()
이 클라이언트는 서버에 연결하고 서버의 메시지를 수신하여 출력하고 연결을 닫습니다.
파이썬 소켓 모듈을 사용한 파일 전송
소켓 프로그래밍의 실질적인 응용 중 하나는 파일 전송입니다. 클라이언트에서 서버로 파일을 보내는 간단한 예제를 보겠습니다:
서버:
import socket
def receive_file():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("서버가 파일을 기다리는 중...")
client_socket, address = server_socket.accept()
print(f"{address}에서 온 연결이 설정되었습니다!")
with open('received_file.txt', 'wb') as file:
while True:
data = client_socket.recv(1024)
if not data:
break
file.write(data)
print("파일을 성공적으로 수신했습니다!")
client_socket.close()
receive_file()
클라이언트:
import socket
def send_file():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
with open('file_to_send.txt', 'rb') as file:
data = file.read(1024)
while data:
client_socket.send(data)
data = file.read(1024)
print("파일을 성공적으로 전송했습니다!")
client_socket.close()
send_file()
이 예제는 클라이언트에서 서버로 파일을 보내는 방법을 보여줍니다.
파이썬 socketserver 모듈
보다 복잡한 서버 애플리케이션을 위해 파이썬은 socketserver
모듈을 제공합니다. 이 모듈은 네트워크 서버 작성을 단순화시킵니다. 간단한 예제를 보겠습니다:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print(f"수신: {self.data.decode()}")
self.request.sendall("메시지 수신".encode())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
print("서버가 실행 중입니다...")
server.serve_forever()
이 서버는 socketserver
모듈을 사용하여 수신한 메시지를 에코하는 TCP 서버를 만듭니다.
그렇습니다, 여러분! 우리는 파이썬에서 소켓 프로그래밍의 기본을 다루었고, 간단한 클라이언트와 서버, 파일 전송 및 socketserver
모듈의 사용을 배웠습니다. 연습이 완벽을 만드는 것을 기억하고, 이 개념들을 실험해 보세요. 행복한 코딩!
Credits: Image by storyset