빅데이터 프로그래밍/Python

[Python] 15. [Network] Network(네트워크), Socket, Echo Server 1

밍글링글링 2017. 8. 2.
728x90

01. 네트워크 개론

1. IP and Port의 이해

- TCP/IP 프로토콜은 IP와 PORT 정보를 이용하여 사용됩니다.
- 프로토콜은 인간의 언어 처럼 2대 이상의 컴퓨터가 서로 데이터를 주고받는 하드웨어적, 소프트웨어적 규칙(규격)을 말합니다.

- IP 하나당 사용 가능한 포트 : 0 ~ 65535 (2Byte)
- 알려진 개발자가 사용할 수 없는 포트(Well known port)
20, 21 : FTP, 파일 전송
22 : Secure Shell 접속, SSH, 서버 콘트롤, 원격 서버 조작.
23 : Telnet, 원격 접속, 서버 콘트롤, 보안성이 없음.
25 : SMTP, 메일 전송
80 : HTTP, Apache, IIS등 웹서버, 인터넷 웹 페이지 서비스
110: POP3 , 메일 수신 
1433 : MS-SQL DBMS 기본 포트, DBMS
1521 : Oracle DBMS 기본 포트, DBMS
3306 : MySQL DBMS 기본 포트, DBMS
3690 : SVN 소스 동기화 개발 서버
8080 : Apache, 기타 웹 서버, 오라클 DBMS 웹서버
- 1500번 이하는 시스템이 사용하는 포트가 많음으로 1500번 이상 사용을 권장합니다. 10000번 이상 사용하면 충돌이 거의 없음.
 

2. IP의 확인: ipconfig (linux: ifconfig) 
1) IP Address. . . .  . : 172.16.7.1

  
02. Socket, ServerSocket

- 서버 강제 종료: 작업 관리자 -> python.exe 종료

1. Echo 서버의 제작
1) Server 프로그램의 기본 처리 형태

① 소켓 객체 생성: socket.socket()

② 생성한 소켓을 서버 IP 및 PORT와 바인드:sock.bind()

③ 처리 가능한 연결 수 설정: socket.listen()

④ 클라이언트 요청을 기다리고 연결 요청이 오면 수락: socket.accept()

⑤ 클라이언트 요청 메시지 수신: socket.recv()

⑥ 수신 메시지에 대한 처리

⑦ 클라이언트로 응답 데이터 송신: socket.sendall() None 리턴, socket.send() 송신한 바이트 리턴

⑧ 소켓 객체 제거: socket.close()

2) 실행
/ws_python/oop/network>python EchoServer1.py

▷ network.EchoServer1.py
- 한명의 접속자만 처리 가능
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import socket

HOST = ''
PORT = 9009

def runServer():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # 자동 close
        sock.bind((HOST, PORT))  # 연결
        sock.listen(1)  # 동시 처리
        print('클라이언트 연결을 기다리는 중...')
        conn, addr = sock.accept()  # 접속 대기
        
        with conn:
            print('[%s]와 연결됨' %addr[0])
            while True:
                data = conn.recv(1024)  # 1024 byte 수신
                if not data:  # 수신 데이터가 없으면 순환문 종료
                    break
                print('메시지 수신 [%s]' %data.decode()) #  수신 데이터 출력, 한글 처리
                # Client에게 다시 전송, 모두 전송하면 None 리턴
                conn.sendall(data) 
runServer()       

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

 

2. Echo client의 제작

1) Client 프로그램의 기본 처리 형태

① 소켓 객체 생성: socket.socket()

② 서버에 연결:socket.connect()

③ 서버로 메시지 전송: socket.send()

④ 서버로부터 데이터 수신: socket.recv()

⑤ 소켓 객체 제거: socket.close()

2) 실행
/ws_python/oop/network>python EchoClient1.py

 
▷ network.EchoClient1.py
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import socket

HOST = 'localhost'
PORT = 9009

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # 자동 close
    sock.connect((HOST, PORT))
    msg = input('메시지 입력: ')
    sock.sendall((msg.encode())) # 한글 -> ASCII 코드 16진수로 변환
    data = sock.recv(1024)  # 수신 대기

print('에코 서버로부터 받은 데이터 [%s]' %data.decode())


-----------------------------------------------------------------------------------
 
 
[실습 1] 서버로부터 문자열을 전달받는 프로그램의 제작
- 실행시 console 창에서 start를 실행하면 경로가 자동으로 이동됩니다.
 
1. Server
- 서버에서 전달하는 항목: 추천하는 문자열을 접속자에게 전송합니다.
예) 맛집, 산, 바다, 계절별, 여행(국내/해외), 영화, 도서, 휴양림, 휴계소등

- 통신중인 컴퓨터는 같은 형식의 데이터를 주고받아야하며
서버에서 전달하는 문자열은 형식을 가지고 있습니다.
예) 형식화된 Text, CVS( 콤마 구분 파일), JSON(문자열 객체),
XML(사용자 정의 태그), 기타 파일

- 서버 실행을 Eclipse에서 진행할시 서버 화면이 감추어지며, 이클립스 종료시
서버가 계속 살아 있을 수 있습니다. 따라서 Eclipse에서는 서버를 실행하지 않습니다.
콘솔에서 실행합니다.


[실행 화면]
/ws_python/oop/network>python ExamServer1.py 

 

클라이언트 연결을 기다리는 중..
[127.0.0.1]와 연결됨
 
▷ network.ExamServer1.py
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import socket

HOST = ''
PORT = 9009

def runServer():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # 자동 close
        sock.bind((HOST, PORT))  # 연결
        sock.listen(1)  # 동시 처리
        
        while True:
            print('클라이언트 연결을 기다리는 중...')
            conn, addr = sock.accept()  # 접속 대기
        
            with conn:
                print('[%s]와 연결됨' %addr[0])
                # Client에게 다시 전송, 모두 전송하면 None 리턴
                conn.sendall('동해/남해/서해'.encode()) 
                
runServer()        
        
        

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

 

2. Client
- 실행 옵션: 
  import sys
  dest = sys.argv[1]

[실행 화면]
/ws_python/oop/network>python ExamClient1.py 172.16.7.100
[여행 추천]
서버로부터 받은 데이터 [동해]
서버로부터 받은 데이터 [남해]
서버로부터 받은 데이터 [서해]
▷ network.ExamClient1.py
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import socket

HOST = 'localhost'
PORT = 9009

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # 자동 close
    sock.connect((HOST, PORT))
    data = sock.recv(1024)  # 수신 대기

values = data.decode().split('/')

print('서버로부터 받은 데이터 [%s]' %values[0])
print('서버로부터 받은 데이터 [%s]' %values[1])
print('서버로부터 받은 데이터 [%s]' %values[2])


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

 

728x90

댓글