[Python] 16. [Network] socketserver 네트워크 프레임워크, Echo Server 2, 파일 송수신

2017. 8. 2. 17:35·빅데이터 프로그래밍/Python
728x90
반응형
1. 계속 실행되는 Echo 서버의 제작
- socketserver.BaseRequestHandler class를 상속받아 구현
 
 
[실행 화면] 
/ws_python/oop/network>python EchoServer2.py
▷ network.EchoServer2.py
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import socketserver

HOST = ''
PORT = 9009 # 0 ~ 65535, 일반적으로 1000번이상 사용하면 충돌이 없음.

# socketserver.BaseRequestHandler 상속받아 구현
class MyTcpHandler(socketserver.BaseRequestHandler):
    # 이 클래스는 서버 하나당 단한번 초기화됩니다.
    # handle() 메소드에 클라이언트 연결 처리를 위한 로직을 구현합니다.
    # 접속자가 발생하면 자동 호출됨, Call Back 메소드.
    def handle(self):
        print('▷ [%s] 연결됨' %self.client_address[0]) # 연결된 IP 출력 

        try:
            while True:
                self.data = self.request.recv(1024)  # 수신 대기
                if self.data.decode() == '/exit':
                    print('▷ [%s] 사용자에 의해 중단' %self.client_address[0])
                    return  # while문 종료

                print('[%s]' %self.data.decode())  # 수신 메시지 출력
                self.request.sendall(self.data)      # 현재 접속자에게 전송
        except Exception as e:
            print(e)

def runServer():
    print('▷ 에코 서버를 시작합니다.')
    print('▷ 에코 서버를 끝내려면 접속된 사용자를 종료후 Ctrl-C를 누르세요.')

    try:
        server = socketserver.TCPServer((HOST, PORT), MyTcpHandler)       
        server.serve_forever() # Ctrl + C, server.shutdown() 호출시까지 계속 실행
    except KeyboardInterrupt:
        print('▷ 에코 서버를 종료합니다.')
      
runServer()

    
-----------------------------------------------------------------------------------
 
2. Echo client의 제작

 

[실행 화면]
/ws_python/oop/network>python EchoClient2.py 172.16.7.100
▷ network.EchoClient2.py
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import socket, sys

HOST = sys.argv[1]  # localhost, 콘솔 입력, 첫번째 전달 값 IP
PORT = 9009          # 서버의 포트

# sock 객체를 생성하며 자동 Close
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.connect((HOST, PORT)) # 서버로 접속
    
    while True:
        msg = input('메시지 입력: ')
        if msg == '/exit':
            sock.sendall(msg.encode()) # /exit 전송
            break  # while 문 종료

        sock.sendall(msg.encode()) # 서버로 메시지 전송
        data = sock.recv(1024)       # 수신 대기
        print('에코 서버로부터 받은 데이터 [%s]' %data.decode())

print('클라이언트 종료')

  
-----------------------------------------------------------------------------------
 

 

02. socketserver 네트워크 프레임워크를 이용한 파일 송수신
 
1. File 서버의 제작
- socketserver.BaseRequestHandler class를 상속받아 구현
 
 
[실행 화면] 
/ws_python/oop/network>python FileServer1.py
▷ network.FileServer1.py
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import sys
import socketserver
from os.path import exists

class MyTcpHandler(socketserver.BaseRequestHandler):
    # 접속자 발생시 호출
    def handle(self):
        data_transferred = 0
        print('[%s] 연결됨' %self.client_address[0])
        filename = self.request.recv(1024) # 전송할 파일명 수신
        
        if filename.decode() == '/exit':
            print('▷ [%s] 사용자에 의해 중단' %self.client_address[0])
            # sys.exit()  # 서버 종료       
        
        # 파일 접근시 절대 경로가 필요함으로 지정된 경로 조합                
        filename = 'C:/201705_python/swiss/'  + filename.decode()
        print('--> filename: ' + filename)
        
        if not exists(filename): # 파일이 존재하는지 검사
            return # 존재하지 않으면 처리 중지

        print('파일 [%s] 전송 시작...' %filename) 
        with open(filename, 'rb') as f:  # read binary          
            try:
                data = f.read(1024)  # 1 KB 읽기
                # 파일이 전송 종료해야 while문 끝남.
                while data: # 0이 아니면 계속 순환, 파일에서 읽은 데이터수가 있다면
                    # self.request: 접속된 Client, 읽은 데이터 전송
                    # 전송한 바이트 수을 누적
                    data_transferred = data_transferred + self.request.send(data)
                    data = f.read(1024) # 파일에서 1 KB 읽기
            except Exception as e:
                print(e)

            print('전송완료[%s], 전송량[%d]' %(filename, data_transferred))
        
def runServer(host, port):
    print('▷ 파일 서버를 시작합니다.')
    print('▷ 파일 서버를 끝내려면 Ctrl-C를 누르세요.')

    try:
        server = socketserver.TCPServer((host, port), MyTcpHandler)       
        server.serve_forever()
    except KeyboardInterrupt:
        print('▷ 파일 서버를 종료합니다.')

''' 
F:
CD 201704_python/ws_python/oop/network
python FileServer1.py 172.16.7.100 9009
'''
runServer(sys.argv[1], int(sys.argv[2])) 

  

-----------------------------------------------------------------------------------
 

 

2. File client의 제작
- C:/201705_python/download 폴더를 미리 생성합니다.

 

[실행 화면]
/ws_python/oop/network>python FileClient1.py
 
▷ network.FileClient1.py
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import sys, socket

def getFileFromServer(host, port, filename):
    data_transferred = 0
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((host, port)) # 서버 연결
        sock.sendall(filename.encode()) # 파일명 전송, 서버 종료: /exit

        data = sock.recv(1024) # 파일 수신
        if not data: # 읽은 데이터 없는 경우
            print('파일[%s]: 서버에 존재하지 않거나 전송중 오류발생' %filename)
            return 

        # 기록을 위해 보낸 파일명으로 쓰기 모드로 열기 
        with open('C:/201705_python/download/'+filename, 'wb') as f:
            try:
                while data: # 수신된 데이터가 있으면 계속 실행
                    f.write(data) # 1KB 기록
                    data_transferred = data_transferred + len(data) # 수신받은 데이터 산출
                    data = sock.recv(1024) # 새로운 1 KB 데이터 수신
            except Exception as e:
                print(e)

            print('파일 [%s] 전송종료. 전송량 [%d]' %(filename, data_transferred))
            # 파일 전송 받으면 네트워크 종료 
'''
F:
CD 201704_python/ws_python/oop/network
python FileClient1.py 172.16.7.100 9009
'''
while True:  # 무한 루틴
    print('종료는 \'/exit\' 입니다.');
    filename = input('다운로드 받을 파일이름을 입력하세요: ')

    if filename == '/exit':
        sys.exit()
        
    # 접속 시도              
    getFileFromServer(sys.argv[1], int(sys.argv[2]), filename) 
   


-----------------------------------------------------------------------------------
 

728x90
반응형

'빅데이터 프로그래밍 > Python' 카테고리의 다른 글

[Python] 18. [GUI] wxPython 그래픽 사용자 인터페이스, 기본 Widget, Sizer  (0) 2017.08.02
[Python] 17. [Network] threading module, 채팅 서버/클라이언트 제작  (0) 2017.08.02
[Python] 15. [Network] Network(네트워크), Socket, Echo Server 1  (0) 2017.08.02
[Python] 14. [IO] 데이터 파일을 읽어 성적, 연봉, 단풍 여행 처리 시스템을 작성하세요.  (0) 2017.08.02
[Python] 13. [IO] IO(입출력), File 클래스 다루기, 파일 이동, 디렉토리 조작, 파일 목록, 파일 복사  (0) 2017.08.02
'빅데이터 프로그래밍/Python' 카테고리의 다른 글
  • [Python] 18. [GUI] wxPython 그래픽 사용자 인터페이스, 기본 Widget, Sizer
  • [Python] 17. [Network] threading module, 채팅 서버/클라이언트 제작
  • [Python] 15. [Network] Network(네트워크), Socket, Echo Server 1
  • [Python] 14. [IO] 데이터 파일을 읽어 성적, 연봉, 단풍 여행 처리 시스템을 작성하세요.
밍글링글링
밍글링글링
mingling - 밍글링, 밍글밍글링. 코드와 어우러지다. IT/ 프로그래밍/소스
    반응형
    250x250
  • 밍글링글링
    mingling
    밍글링글링
  • 전체
    오늘
    어제
    • 밍글링글링 (407) N
      • Flutter (2)
      • 일상생활 (8)
        • 리뷰 (1)
        • 생활정보 (4)
        • 맛집 (0)
        • 여행 (0)
        • 모든정보 (3)
      • JAVA (126)
        • 개념 (6)
        • 예제 (115)
        • Exception (2)
      • C (1)
        • C (1)
        • C++ (0)
        • C# (0)
      • JS (29)
        • JavaScript (18)
        • JQuery (5)
        • AJax (0)
        • NODE.JS (6)
        • Angular.JS 2.0 (0)
      • WEB (87)
        • HTML (6)
        • CSS (61)
        • JSP (20)
        • JSTL (0)
      • FrameWork (8)
        • Spring (8)
        • BootStrap (0)
        • MyBATIS (0)
        • JUnit (0)
      • 외부 라이브러리 (5)
      • 공유 소스 관리 (5)
        • Git (5)
        • SVN (0)
      • 빅데이터 프로그래밍 (37)
        • Python (37)
        • R Programming (0)
      • DB (7)
        • ORACLE (0)
        • MySql (6)
      • Development Tools (7)
        • StarUML (0)
        • eXERD (0)
        • Eclipse (4)
      • SKILL (6)
        • Migration (0)
        • Security (6)
      • MicroSoft (0)
        • Excel (0)
        • Word (0)
      • Android (0)
      • Server (21)
        • Ubuntu (5)
        • Linux (15)
      • IOS (0)
      • XML (0)
      • 미디어 (0)
      • 공지사항 (3)
      • NETWORK (1)
      • 게임 (4)
        • 피파 (1)
        • 리니지M (0)
        • 배틀그라운드 (1)
        • 듀랑고 (2)
      • 세상 이슈 (6)
      • 일렉트론 (0)
      • 대회 소식 (4)
      • 업무 (2)
      • Express, Vue (6)
      • docker (11)
      • svelte (3)
      • 블록체인 (1)
      • IT (10) N
      • Rust (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    servlet class
    nginx ssl 적용
    자바 클래스
    css perspective
    에디터 팁
    jsp parameter
    gitlab 설치
    자바 for문
    Node
    jsp include
    클론코딩
    Rust lang
    자바 배열
    브라우저 자동화
    css float
    spring java
    React Compiler
    자바 생성자
    css transition
    AI 코딩 에이전트
    Java Array
    리눅스 설치
    rust linux
    css tb
    vue cli
    css block
    티스토리 자동화
    러스트
    css table
    VS Code 팁
    mysql db
    오류
    css list
    프런트엔드
    docker
    ssl 인증서 발급
    lang rust
    proxy pass
    nginx ssl 설정
    ubuntu
    API 설계
    Extension Bisect
    자바 exception
    nginx
    vue 설치
    vscode
    java casting
    자바 객체 지향
    SSL 인증서
    svelte
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
밍글링글링
[Python] 16. [Network] socketserver 네트워크 프레임워크, Echo Server 2, 파일 송수신
상단으로

티스토리툴바