한국어 번역

안녕하세요, 미래의 파이썬 마법사 여러분! 오늘 우리는 소켓 프로그래밍의 흥미로운 세계로 접수합니다. 새로운 것에 대한 걱정은 하지 마세요; 우리는 기본부터 차근차근 시작해 나갈 것입니다. 이 튜토리얼의 끝을 맞아서, 여러분은 프로처럼 자신만의 네트워크 애플리케이션을 만들 수 있을 것입니다!

Python - Socket Programming

소켓은 무엇인가요?

멀리 떨어져 사는 친구에게 이야기하려고 할 때, 메시지를 보내고 그들의 답을 받을 방법이 필요합니다. 컴퓨터 세계에서 소켓은 이 역할을 합니다. 이들은 컴퓨터 간 통신을 가능하게 하는 전화선과 같습니다.

소켓은 네트워크에서 실행 중인 두 개의 프로그램 간의 양방향 통신 연결의 종단점입니다. 이들은 클라이언트(예: 웹 브라우저)와 서버(예: 웹사이트) 간에 메시지를 보내는 방법입니다.

파이썬 소켓 모듈

파이썬은 내장된 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