티스토리 뷰

python

Python 소켓으로 파일 보내기

on1ystar 2019. 3. 24. 21:32
728x90
반응형

소켓 프로그래밍의 개념적인 부분 참조 : 네트워크 소켓 프로그래밍 개요

명령행 인자 부분 참조 : Python argparse 명령행 인자 받기

파일 부분 참조 : Python 파일 처


소켓으로 서버와 클라이언트가 파일 주고 받기


> python file_client.py -i '서버 ip주소' -p '포트 번호' -f '파일 명'

> python file_server.py -p '포트 번호' -d '파일 디렉토리'


## file_sever.py

import socket
import argparse
from os.path import exists
import os

def run_server(port, directory):
host = ''

with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
fileName = conn.recv(1024)
fileName = fileName.decode()
## 해당 경로에 파일이 없으면 에러
if not exists(directory+"\\"+fileName):
msg = "error"
conn.sendall(msg.encode())
conn.close()
return
conn.sendall(getFileSize(fileName, directory).encode())
## client가 파일 내용을 받을 준비 확인
reReady = conn.recv(1024)
if reReady.decode() == "ready":
conn.sendall(getFileData(fileName, directory).encode())
conn.close()

## 파일의 크기를 반환하는 함수
def getFileSize(fileName, directory):
fileSize = os.path.getsize(directory+"\\"+fileName)
return str(fileSize)

## 파일의 내용을 반환하는 함수
def getFileData(fileName, directory):
with open(directory+"\\"+fileName, 'r', encoding="UTF-8") as f:
data = ""
## 파일이 매번 각 라인을 읽어 리턴할 수 있기 때문에 라인마다 끊어서 저장
for line in f:
data += line
return data

if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Echo server -p port -d directory")
parser.add_argument('-p', help="port_number", required=True)
parser.add_argument('-d', help="directory", required=True)

args = parser.parse_args()
run_server(port=int(args.p), directory=args.d)


## file_client.py

import socket
import argparse

def run(host, port, fileName):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.sendall(fileName.encode())

## reSize = 파일 사이즈
reSize = s.recv(1024)
reSize = reSize.decode()
## 디렉토리에서 파일을 못찾아 error를 보냈을 경우
if reSize == "error":
print("파일을 찾을 수 없습니다.")
return
## client가 파일 크기를 받았고, 파일 내용을 받을 준비가 되었다는 것을 알림
msg = "ready"
s.sendall(msg.encode())

with open(fileName, 'w', encoding="UTF-8") as f:
## 파일 사이즈만큼 recv
data = s.recv(int(reSize))
f.write(data.decode())


print("file name : "+fileName)
print("size : "+reSize)

if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Echo client -p port -i host -f file")
parser.add_argument('-p', help="port_number", required=True)
parser.add_argument('-i', help="host_name", required=True)
parser.add_argument('-f', help="file_name", required=True)

args = parser.parse_args()
run(host=args.i, port=int(args.p), fileName=args.f)



728x90
반응형

'python' 카테고리의 다른 글

IndentationError: unindent does not match any outer indentation level  (0) 2019.04.14
Python 진법 변환  (0) 2019.03.31
Python 파일 처리  (0) 2019.03.23
Python 소켓 모듈 사용  (0) 2019.03.17
Python argparse 명령행 인자 받기  (0) 2019.03.17
댓글