인터넷 구조
네트워크 가장자리 (edge)
- 호스트: 클라이언트와 서버
- 데이터 센터 내의 서버들
네트워크 코어 (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)
소켓 종료
파이썬 소켓 - 서버 연결 초기화
주소와 소켓 결합
- 서버의 주소(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 소켓 프로그램 예 소개
- 클라이언트는 키보드로 한 줄의 문자(데이터)를 읽고, 그 데이터를 서버로 송신
- 서버는 데이터를 수신하고, 문자를 대문자로 변환
- 서버는 수정된 데이터를 클라이언트에게 송신
- 클라이언트는 수정된 데이터를 수신하고 화면에 출력
임시로 한 컴퓨터에 서버와 클라이언트를 동시에 실행하여 테스트하기
스레드 소개
파이썬 스레드 생성 및 실행
스레드 라이브러리: threading 모듈
스레드 생성
- threading.Thread(target=함수이름, args(인수, ...) 함수: return Thread
- 스레드 생성 예
t = threading.Thread(target=func, args (10, 20))
스레드 실행
- Thread.start() 메서드
객체지향 스레드 생성 및 실행
threading 모듈의 Thread 클래스를 상속 받는 클래스 정의
- run() 메서드에서 스레드로 실행될 부분 작성
- 생성자에서는 부모 클래스 생성자 호출 (super(). init ())
- 클래스 객체 생성 후 start() 메서드로 스레드 실행