6. 네트워크 응용: 소켓 프로그래밍

최지온·2023년 10월 10일

프로그래밍 응용

목록 보기
6/10
post-thumbnail

인터넷 구조

네트워크 가장자리 (edge)

  • 호스트: 클라이언트와 서버
  • 데이터 센터 내의 서버들

접속 네트워크 (access network), 물리 매체 (physical media)

  • 유무선 통신 링크

네트워크 코어 (core)

  • 라우터
  • 네트워크들의 네트워크

소켓 프로그래밍 소개

클라이언트 / 서버 구조

서버 (server)

  • 항상 켜져 있는 호스트
  • 고정 IP 주소
  • 데이터 센터로 확장

클라이언트 (client)

  • 서버와 통신
  • 클라이언트들 간 직접 통신하지 않음
  • 유동 IP 가질 수 있음
  • 항상 연결되어 있지 않고 간헐적으로 통신할 수 있음

인터넷 주소

IP 주소

  • 호스트 / 라우터 주소
  • IPv4 주소: 32비트

포트 번호

  • 호스트 내의 프로세스 (실행 중인 프로그램)을 구분하는 번호

소켓 (Socket)

프로세는 소켓 (Socket)을 통해 네트워크로 메시지를 송수신

  • 소켓은 호스트의 애플리케이션 계층과 트랜스포트 계층 간의 인터페이스
  • 프로세스는 집(house), 소켓은 출입구(door)에 비유
  • 소켓은 애플리케이션과 네트워크 사이의 API (Application Programming Interface)

소켓 프로그래밍

두 가지 형태의 트랜스포트 서비스

  • UDP: 비연결형, 비신뢰적인 데이터 전송
  • TCP: 연결형, 신뢰적인 데이터 전송

TCP 소켓 프로그래밍

  • 서버 프로세스가 먼저 수행 중에 있어야 함.
  • 클라이언트는 서버에 초기 접속
  • 서버는 클라이언트에 의해 초기 접속 클라이언트와 통신하는 서버 프로세스를 위한 새로운 소켓(연결 소켓)을 생성
  • 서버와 클라이언트가 데이터 송수신

TCP 클라이언트 / 서버 소켓 상호동작

TCP 클라이언트 / 서버 소켓 상호동작 - 파이썬

파이썬 소켓 - 소켓 생성

소켓 라이브러리: socket 모듈

소켓 생성

  • socket.socket(family, type, proto=0) 함수: return socket

TCP 소켓 생성 예

  • serverSocket = socket(AF_INFT, SOCK_STREAM)

소켓 종료

  • socket.close() 메서드

파이썬 소켓 - 서버 연결 초기화

주소와 소켓 결합

  • 서버의 주소(IP 주소, 포트번호)를 생성된 소켓과 결합
  • socket.bind(address) 메서드

연결 요청 청취

  • 클라이언트로부터 소켓 연결 요청을 청취
  • socket.listen(backlog) 메서드

연결 수락

  • 클라이언트의 연결 요청을 수락
  • socket.accept() 메서드: return (socket, address)

파이썬 소켓 - 서버 연결 초기화 예

서버 연결 초기화 예

  • 서버의 IP 주소가 '123.456.789.012' 이라고 가정
  • 7000 번 포트 번호로 클라이언트의 연결 요청을 청취하는 예
# 호스트 주소 지정
serverName = '123.456.789.012'
serverPort = 7000
# 소켓 생성
serverSocket = socket(AF_INET, SOCK_STREAM)
# 주소와 소켓 결합
serverSocket.bind((serverName, serverPort))
# 연결 요청 청취
serverSocket.listen(5)
# 연결 요청 수락, 연결 소켓 생성
connectionSocket, addr = serverSocket.accept()

파이썬 소켓 - 데이터 송수신

데이터 송신

  • socket.send(btyes) 메서드: return bytes_num

데이터 수신

  • socket.recv(bufsize) 메서드: return bytes

예

data = input('input string: ') 
clientSocket.send(data.encode("utf8")) # 문자열 인코드하여 송신
……
data = clientSocket.recv(1024) # 데이터 수신
print(data)

TCP 소켓 프로그램 예 소개

  1. 클라이언트는 키보드로 한 줄의 문자(데이터)를 읽고, 그 데이터를 서버로 송신
  2. 서버는 데이터를 수신하고, 문자를 대문자로 변환
  3. 서버는 수정된 데이터를 클라이언트에게 송신
  4. 클라이언트는 수정된 데이터를 수신하고 화면에 출력

임시로 한 컴퓨터에 서버와 클라이언트를 동시에 실행하여 테스트하기

스레드 소개

파이썬 스레드 생성 및 실행

스레드 라이브러리: threading 모듈
스레드 생성

  • threading.Thread(target=함수이름, args(인수, ...) 함수: return Thread
  • 스레드 생성 예
    t = threading.Thread(target=func, args (10, 20))
    스레드 실행
  • Thread.start() 메서드

객체지향 스레드 생성 및 실행

threading 모듈의 Thread 클래스를 상속 받는 클래스 정의

  • run() 메서드에서 스레드로 실행될 부분 작성
  • 생성자에서는 부모 클래스 생성자 호출 (super(). init ())
  • 클래스 객체 생성 후 start() 메서드로 스레드 실행
profile
왕초보입니다

0개의 댓글