[파이썬] socket 소켓을 통한 파일 전송

파일 전송은 네트워크 프로그래밍에서 가장 일반적인 작업 중 하나입니다. Python의 socket 모듈을 사용하면 손쉽게 파일을 전송할 수 있습니다. 이번 블로그 포스트에서는 socket을 사용하여 파일을 전송하는 간단한 예제를 소개하겠습니다.

서버 측 코드

아래는 파일을 수신하는 서버 측 코드입니다. socket 모듈을 사용하여 서버를 생성하고 클라이언트의 연결을 수락합니다. 그런 다음, 클라이언트로부터 파일 데이터를 수신하고 로컬 파일에 저장합니다.

import socket

def save_file(file_path, client_socket):
    with open(file_path, 'wb') as file:
        while True:
            data = client_socket.recv(1024)
            if not data:
                break
            file.write(data)

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 8000))
    server_socket.listen(1)

    print('서버가 실행 중입니다.')

    while True:
        client_socket, addr = server_socket.accept()
        print('클라이언트가 접속했습니다:', addr)

        file_path = client_socket.recv(1024).decode()
        print('수신할 파일:', file_path)

        save_file(file_path, client_socket)
        print('파일 수신 완료:', file_path)

        client_socket.close()

if __name__ == '__main__':
    main()

클라이언트 측 코드

아래는 파일을 송신하는 클라이언트 측 코드입니다. socket 모듈을 사용하여 서버에 연결하고 송신할 파일의 경로를 전송합니다. 그런 다음, 파일 데이터를 읽어서 서버로 전송합니다.

import socket

def send_file(file_path, server_socket):
    with open(file_path, 'rb') as file:
        while True:
            data = file.read(1024)
            if not data:
                break
            server_socket.sendall(data)

def main():
    server_address = ('localhost', 8000)

    file_path = input('전송할 파일 경로를 입력하세요: ')

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(server_address)

    client_socket.sendall(file_path.encode())

    send_file(file_path, client_socket)
    print('파일 전송 완료:', file_path)

    client_socket.close()

if __name__ == '__main__':
    main()

실행 방법

  1. 먼저 서버를 실행하고 클라이언트를 실행합니다.
  2. 클라이언트에서 전송할 파일의 경로를 입력합니다.
  3. 클라이언트에서 전송을 시작하면 서버는 파일을 수신하고 저장합니다.
  4. 전송이 완료되면 클라이언트와 서버는 연결을 닫습니다.

결론

이번 블로그 포스트에서는 Python의 socket 모듈을 사용하여 파일을 전송하는 방법을 살펴보았습니다. 소켓을 사용하면 네트워크를 통해 파일을 송수신할 수 있으며, 이를 활용하여 다양한 네트워크 애플리케이션을 개발할 수 있습니다.