물먹는산세베리아

파이썬 소캣 프로그래밍 이용해 파일 보내기 본문

Language/Python

파이썬 소캣 프로그래밍 이용해 파일 보내기

suntall 2020. 9. 8. 06:05

* 감을 잡기 어려워서 오픈소스를 활용하여 구성과 역할 중심으로 작성하였고, 파일 위치 등 부분 수정하였다.

1. send.py

 

1)모듈

소켓 프로그래밍을 이용하기 위해 소켓 서버를 import 하였다. 그리고 os.path 모듈에서 exists만 가져왔다. 입력 받은 경로의 존재여부는 구분할 때 쓰인다.

 

2) 파일 전송

같은 컴퓨터에서 실행하기로 하였다.

위 코드의 클래스는 서버에 대한 요청을 하는 핸들러 클래스이다. 서버에 접속할 때마다 한번씩 인스턴스화 되는데, 클라이언트와의 통신을 구현하려면 위처럼 핸들 방식을 재정의 해야 한다. data_transferred는  0으로 초기화 했다가 파일을 받아오면 해당 파일의 바이트 값을 가져와 더하여 파일의 크기값으로 재정의 된다. 그 다음에는 연결된 IP 주소를 출력해주고 그 주소에서 입력받은 바일 이름을 받아온다. recv(1024) 1024의 크기로 받아온다. 이때 바이트 값이 넘어오기 때문에 디코딩 하여 문자열로 변환해 주어야 한다.

if not exists(filename) 파일이 존재하는지 검사하는 부분인데 존재하지 않을 경우 처리를 중지한다.

파일 전송이 시작되고, 그 바이너리 파일의 내용들을 1KB씩 읽어 온다. (읽기 모드 - rb, 쓰기 모드 - wb) 그러는 동안 전송한 바이트가 누적되어 파일의 바이트 크기가 계산된다. 이때 self.requests는 접속된 클라이언트의 읽은 데이터를 전송하는 역할을 한다.

 

3) 파일 서버 시작 및 종료

py 파일을 실행하면 먼저 runServer()함수를 통해 파일 서버를 생성한다. 포트 8081에서 바인딩하여 서버를 만들어 활성화 시키고 Ctrl-C(keyboardInterrupt 예외 발생)를 누르면 프로그램이 중단된다. server.serve_forever() 그 전까지 서버는 계속 작동한다. 서버를 열었으니 MyTcpHandler에서 파일을 전송하는 게 가능해졌다.

 

2. receive.py

1) 모듈

이번에는 socket 모듈을 사용하였고, 같은 컴퓨터에서 결과를 확인하기 위해 로컬에서 진행하였고 포트번호는 8081이다.

 

2) 서버 연결

* with open(파일 경로, 모드) as 파일 객체: 파일을 연 후 해당 구문이 끝났을 때 자동으로 닫는 역할을 한다.

IP주소와 stream 소켓타입을 받아 파일을 연 후 서버를 연결한다. 파일명은 인코딩하여 전송하고 구문이 끝났으므로 서버는 종료된다. 만약 여기서 해당 위치에 없는 파일을 입력하면(즉, 읽은 데이터가 없음) 위처럼 서버에 존재하지 않거나 오류가 발생했다고 출력된다.

 

3) 파일 수신

파일이 생성되는 위치는 C:/abc/ 이고 쓰기 모드(wb)로 열린다. 파일이 수신되는 동안 마찬가지로 1KB씩 기록되고, 그때마다 받은 데이터를 더해준다. 

최종적으로 전송이 끝나면 전송량 즉, 파일의 크기가 파일명과 함께 출력된다.

 

3. 실행 결과 및 전체 코드

파일 전송 전
파일 전송 후
send.py
receive.py