티스토리 뷰
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 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- git merge
- 운영체제 반효경
- 쉽게 배우는 운영체제
- 패킷 스위칭
- JPA
- Spring
- 김영환
- 선형 회귀
- jsp
- spring mvc
- Thymeleaf
- 스프링
- 방명록 프로젝트
- Spring Data JPA
- 파이썬 for Beginner 연습문제
- 스프링 테스트
- 프로그래머스
- Spring Boot
- 파이썬 for Beginner 솔루션
- 스프링 컨테이너
- Computer_Networking_A_Top-Down_Approach
- Do it! 정직하게 코딩하며 배우는 딥러닝 입문
- 지옥에서 온 git
- 생활코딩 javascript
- 스프링 mvc
- 쉘 코드
- git branch
- git
- Python Cookbook
- Gradle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함
반응형