Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
6. 소켓 프로그래밍과 스레드: 채팅 프로그래밍채팅 프로그래밍
순천향대학교 컴퓨터공학과순천향대학교 컴퓨터공학과
이 상 정
순천향대학교 컴퓨터공학과 1
GUI 설계기법
학습 내용학습 내용
인터넷 구조 인터넷 구조• 인터넷 구성 요소
• 인터넷 주소
• 클라이언트/서버 구조
소켓 프로그래밍 소개• 파이썬 소켓 프로그래밍
• TCP 클라이언트/서버 프로그래밍
스레 소개 스레드 소개• 파이썬 스레드
• 채팅 클라이언트/서버 프로그램• 채팅 클라이언트/서버 프로그램
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 2
GUI 설계기법
구성요소로 본 인터넷 (1)구성요소로 본 인터넷 (1)
호스트(host) 종단 시스템(end system) 호스트(host), 종단 시스템(end system)• 컴퓨터 네트워크에 연결된 컴퓨팅 장치
• 네트워크 응용들을 수행
통신 링크(communication link)• 동축케이블, 광케이블,구리선, 전파, 위성
• 다양한 전송률(transmission rate, 또는 bandwidth)로 데이터(패킷) 전송또는 bandwidth)로 데이터(패킷) 전송
패킷 스위치(packet switch) 패킷 스위치(packet switch)• 라우터(router), 스위치(switch)
• 패킷을 전달
6. 소켓 프로그래밍과 스레드
패킷을 전달
순천향대학교 컴퓨터공학과 3
GUI 설계기법
구성요소로 본 인터넷 (2)구성요소로 본 인터넷 (2)
인터넷(Internet) 인터넷(Internet)• 네트워크들의 네트워크
(network of networks)
프로토콜(protocol)• 정보(메시지)의 송수신을 제어
• 예TCP(Transmission Control protocol), IP(Internet Protocol),( ),HTTP, SMTP, 이더넷(Ethernet)
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 4
GUI 설계기법
네트워크 요소네트워크 요소
네트워크 가장자리(edge) 네트워크 가장자리(edge)• 호스트: 클라이언트와 서버
• 데이터 센터 내의 서버들
접속 네트워크(access network),속 네 워 ( ),물리 매체(physical media)• 유무선 통신 링크
네트워크 코어(core)• 라우터
• 네트워크들의 네트워크
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 5
GUI 설계기법
클라이언트/서버 구조클라이언트/서버 구조
서버 (server) 서버 (server)• 항상 켜져 있는 호스트
• 서비스 제공
• 고정 IP 주소
• 데이터 센터로 확장
클라이언트 (client)• 서버와 통신• 서버와 통신
• 서비스 요청
• 클라이언트들 간 직접 통신하지 않음
• 유동 IP 가질 수 있음
• 항상 연결되어 있지 않고 간헐적으로통신할 수 있음
6. 소켓 프로그래밍과 스레드
통신할 수 있음
순천향대학교 컴퓨터공학과 6
GUI 설계기법
인터넷 주소인터넷 주소
인터넷 주소는 IP 주소와 포트 번호로 구분 인터넷 주소는 IP 주소와 포트 번호로 구분
IP 주소• 호스트/라우터 주소호스트/라우터 주소
• IPv4 주소: 32 비트
• 32 비트 IP 주소 공간이 빠른 속도로 고갈되어 가고 있음I 6 128 비트=> IPv6: 128 비트
포트 번호 포트 번호• 호스트 내의 프로세스(프로그램)을 구분하는 번호
• 예
• HTTP 서버: 80, 메일 서버: 25
• 인터넷 표준 프로토콜에 대한 알려진(well-known) 포트번호 리스트는 www iana org 참조
6. 소켓 프로그래밍과 스레드
는 www.iana.org 참조
순천향대학교 컴퓨터공학과 7
GUI 설계기법
소켓 (Socket)소켓 (Socket)
프로세스는 소켓(socket)을 통해 네트워크로 메시지를 송수신 프로세스는 소켓(socket)을 통해 네트워크로 메시지를 송수신• 소켓은 호스트의 애플리케이션 계층과 트랜스포트 계층 간의
인터페이스
• 프로세스는 집(house), 소켓은 출입구(door)에 비유
• 송신 프로세스는 출입구(소켓) 바깥 네트워크로 메시지를 밀어냄
• 소켓은 애플리케이션과 네트워크 사이의 API(Application• 소켓은 애플리케이션과 네트워크 사이의 API(Application Programming Interface)
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 8
GUI 설계기법
소켓 프로그래밍소켓 프로그래밍
두 가지 형태의 트랜스포트 서비스 두 가지 형태의 트랜스포트 서비스• UDP: 비연결형, 비신뢰적인 데이터 전송
• TCP: 연결형, 신뢰적인 데이터 전송,
TCP 소켓 프로그래밍• 서버 프로세스가 먼저 수행 중에 있어야 함
• 서버는 클라이언트의 초기 접속을 처리하는 소켓을 생성해야 함
클라이언트는 서버에 초기 접속• 클라이언트는 서버에 초기 접속
• 클라이언트는 TCP 소켓을 생성하고, 서버 프로세스의 IP 주소와 포트 번호를 명시하여 서버에 접속
• 서버는 클라이언트에 의해 초기 접속 클라이언트와 통신하는 서버 프로세스를 위한 새로운 소켓(연결 소켓)을 생성
• 서버와 클라이언트가 데이터 송수신
6. 소켓 프로그래밍과 스레드
서버와 클라이언트가 데이터 송수신
순천향대학교 컴퓨터공학과 9
GUI 설계기법
TCP 클라이언트/서버 소켓 상호동작TCP 클라이언트/서버 소켓 상호동작
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 10
GUI 설계기법
TCP 클라이언트/서버 소켓 상호동작 – 파이썬TCP 클라이언트/서버 소켓 상호동작 파이썬
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 11
GUI 설계기법
파이썬 소켓 – 소켓 생성파이썬 소켓 소켓 생성
소켓 라이브러리: socket 모듈 소켓 라이브러리: socket 모듈
소켓 생성 소켓 생성• socket.socket(family, type, proto=0) 함수: return socket
• family: 프로토콜 표시, 인터넷인 경우 AF_INET
• type: 인터넷인 경우 트랜스포트 서비스 표시TCP: SOCK_STREAM, UDP: SOCK_DGRAM
• socket 객체를 리턴socket 객체를 리턴
• TCP 소켓 생성 예serverSocket socket(AF INET SOCK STREAM)serverSocket = socket(AF_INET, SOCK_STREAM)
소켓 종료• socket close() 메소드
6. 소켓 프로그래밍과 스레드
• socket.close() 메소드
순천향대학교 컴퓨터공학과 12
GUI 설계기법
파이썬 소켓 – 서버 연결 초기화파이썬 소켓 서버 연결 초기화
주소와 소켓 결합• 서버의 주소(IP 주소, 포츠번호)를 생성된 소켓과 결합
• socket.bind(address) 메소드• address: (host IP 주소 포트) 튜플• address: (host IP 주소, 포트) 튜플
– 튜플(tuple)은 리스트와 거의 비슷하나 리스트와 달리 요소의 변경(추가,삭제 등)할 수 없음
연결 요청 청취 연결 요청 청취• 클라이언트로부터 소켓 연결 요청을 청취
• socket.listen(backlog) 메소드( g)• backlog: 허용되는 최대 요청 수
연결 수락• 클라이언트의 연결 요청을 수락
• socket.accept() 메소드: return (socket, address)• 클라이언트와 통신을 위한 새로운 연결 소켓과 클라이언트의 주소를
6. 소켓 프로그래밍과 스레드
클라이언트와 통신을 위한 새로운 연결 소켓과 클라이언트의 주소를리턴
순천향대학교 컴퓨터공학과 13
GUI 설계기법
파이썬 소켓 – 서버 연결 초기화 예파이썬 소켓 서버 연결 초기화 예
서버 연결 초기화 예 서버 연결 초기화 예• 서버의 IP 주소가 '229.78.56.90' 이라고 가정
• 서버인 경우 IP 주소 생략 가능, ' '
• 7000 번 포트 번호로 클라이언트의 연결 요청을 청취하는 예
# 호스트 주소 지정
' 'serverName = '229.78.56.90'
serverPort = 7000
# 소켓 생성
serverSocket = socket(AF_INET, SOCK_STREAM)
# 주소와 소켓 결합
serverSocket bind((serverName serverPort))serverSocket.bind((serverName, serverPort))
# 연결 요청 청취
serverSocket.listen(5)
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 14
# 연결 요청 수락, 연결 소켓 생성
connectionSocket, addr = serverSocket.accept()
GUI 설계기법
파이썬 소켓 – 클라이언트 연결 초기화파이썬 소켓 클라이언트 연결 초기화
서버에 연결 요청 서버에 연결 요청• 서버에 연결을 요청
• socket.connect(address) 메소드( )
• address는 서버 주소(IP, 포트)
# 연결할 서버 주소 지정결할 서버 주 지정
serverName = '229.78.56.90'
serverPort = 7000
# 소켓 생성# 소켓 생성
clientSocket = socket(AF_INET, SOCK_STREAM)
# 서버에 연결 요청
clientSocket.connect((serverName, serverPort))
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 15
GUI 설계기법
파이썬 소켓 – 데이터 송수신파이썬 소켓 데이터 송수신
데이터 송신• socket.send(bytes) 메소드: return bytes_num
• bytes: 보내질 바이트 데이터들
• 보내진 데이터의 바이트 수 리턴• 보내진 데이터의 바이트 수 리턴
데이터 수신• socket recv(bufsize) 메소드: return bytessocket.recv(bufsize) 메소드: return bytes
• bufsize: 한 번에 받을 수 있는 최대 데이터의 바이트 수
• 받은 데이터의 바이트들 리턴
data = input('input string: ')
clientSocket.send(data.encode("utf8")) # 문자열 인코드하여 송신
……
data = clientSocket.recv(1024) # 데이터 수신
print(data)
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 16
print(data)
GUI 설계기법
TCP 소켓 프로그램 예 소개TCP 소켓 프로그램 예 소개
1 클라이언트는 키보드로 한 줄의 문자(데이터)를 읽고 그 데1. 클라이언트는 키보드로 한 줄의 문자(데이터)를 읽고, 그 데이터를 서버로 송신
2 서버는 데이터를 수신하고 문자를 대문자로 변환2. 서버는 데이터를 수신하고, 문자를 대문자로 변환
3. 서버는 수정된 데이터를 클라이언트에게 송신
4 클라이언트는 수정된 데이터를 수신하고 화면에 출력4. 클라이언트는 수정된 데이터를 수신하고 화면에 출력
한 컴퓨터에서 2개의 파이썬 셀 수행하여 클라이언트/서버 한 컴퓨터에서 2개의 파이썬 셀 수행하여 클라이언트/서버통신• 자기 자신을 나타내는 루프백(loopback) 주소 사용
127.0.0.1
• 윈도우에서 자기 자신의 주소를 알려면 콘솔창에서 ipconfig 명령c> ipconfig
6. 소켓 프로그래밍과 스레드
c> ipconfig
순천향대학교 컴퓨터공학과 17
GUI 설계기법
TCP 프로그램 예 – 서버 프로그램TCP 프로그램 예 서버 프로그램
### TCP 서버 프로그램
from socket import *
while True:
# 연결 요청 수락, 연결 소켓 리턴
connectionSocket, addr = S k ()# 네트워크 TCP 연결 초기화
print("Server TCP initialize...")
# 호스트 주소 지정
serverSocket.accept()
print("Client connected...", addr)
# 데이터 수신
( )serverPort = 7000
# 서버 소켓 생성
serverSocket = socket(AF_INET, SOCK_STREAM)
rawData = connectionSocket.recv(1024)
print("receive: ", rawData)
# 대문자 변환
# 주소와 소켓 결합
serverSocket.bind(('', serverPort))
# 연결 요청 청취
upperStr = rawData.upper()
# 데이터 송신
connectionSocket.send(upperStr)
serverSocket.listen(1) connectionSocket.close()
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 18
GUI 설계기법 TCP 프로그램 예 – 클라이언트 프로그램
### TCP 클라이언트 프로그램
from socket import *
# 네트워크 TCP 연결 초기화
print("Client TCP initialize...")
# 연결할 서버 주소 지정
serverName = '127.0.0.1'
serverPort = 7000
# 클라이언트 소켓 생성
clientSocket = socket(AF_INET, SOCK_STREAM)
# 서버에 연결 요청
clientSocket.connect((serverName, serverPort))clientSocket.connect((serverName, serverPort))
print("Server connected...")
rawData = input('Input string: ')rawData input( Input string )
# 문자열 인코드하여 데이터 송신
clientSocket.send(rawData.encode("utf8"))
# 데이터 수신
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 19
# 데이터 수신
modifiedStr = clientSocket.recv(1024)
print("from server: " , modifiedStr)
GUI 설계기법
시험주행시험주행
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 20
GUI 설계기법
TCP 프로그램 예 동작 검토TCP 프로그램 예 동작 검토
앞의 예제 프로그램의 예제• 서버 프로그램에서 같은 클라이언트 연결에 대해서도 매번 연결 요청
수락
루프 내에서 연결 요청 수락• 루프 내에서 연결 요청 수락
• 클라이언트 한 번 데이터 송수신 후 종료
• 데이터 수신 시 동작데이터 수신 시 동작
• 데이터 수신 시 데이터를 받을 때까지 프로그램이 블록킹(blocking)
• 데이터 수신 까지 프로그램이 다른 동작을 못함
개선된 프로그램 – 채팅 프로그램• 한 번 연결 수락으로 클라이언트 종료하지 않고 계속 데이터 송수신
루프 밖에서 연결 요청 수락• 루프 밖에서 연결 요청 수락
• 데이터 수신 블록킹 문제
• 데이터 수신 동작을 독자적인 프로그램(스레드)로 실행하여 해결
6. 소켓 프로그래밍과 스레드
데이터 수신 동작을 독자적인 프로그램(스레드)로 실행하여 해결
순천향대학교 컴퓨터공학과 21
GUI 설계기법
파이썬 스레드 생성 및 실행파이썬 스레드 생성 및 실행
스레드 라이브러리: threading 모듈 스레드 라이브러리: threading 모듈
스레드 생성• threading Thread(target=함수이름 args=(인수 ……)) 함수:threading.Thread(target 함수이름, args (인수, )) 함수:
return Thread
• target: 실행될 함수 이름
함수에 전달될 인수• args: 함수에 전달될 인수튜플로 표시되며 인수가 없으면 생략인수가 하나인 경우는 (인수,)로 표시
• Thread 객체를 리턴
• 스레드생성 예t = Thread(target=func, args = (10, 20))( g , g ( , ))
스레드 실행• Thread.start() 메소드
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 22
GUI 설계기법
스레드 예from threading import * 스레드 예from threading import *
# 스레드로 실행되는 함수
def testPrint(m n=5):def testPrint(m, n=5):
print("testPrint(%d) "%m)
for i in range(m,n):
print(" %d" %i)print( %d %i)
# 스레드 생성 및 실행
th Th d(t t t tP i t (2 ))th = Thread(target=testPrint, args=(2,))
th.start()
i t(" i P i t ")print("mainPrint ")
for i in range(100,106):
print(" %d" %i)
# 스레드 생성 및 실행
th = Thread(target=testPrint, args=(30,35))
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 23
th.start()
GUI 설계기법
시험주행시험주행
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 24
GUI 설계기법
채팅 프로그램 예채팅 프로그램 예
클라이언트와 서버가 서로 문자를 주고 받는 채팅 프로그램 클라이언트와 서버가 서로 문자를 주고 받는 채팅 프로그램예• 한 번 연결 수락으로 클라이언트 종료하지 않고 계속 데이터 송수신
• 루프 밖에서 연결 요청 수락
• 데이터 수신 동작을 독자적인 프로그램(스레드)로 실행
• 한글 송수신을 위해 UTF8 인코드/디코드
• 파이썬 GUI에서는 수신 문자가 바로 출력되지 않음=> 윈도우 프롬트 창에서 실행> 윈도우 프롬트 창에서 실행
• 문제점
• 1:1 채팅 프로그램
• 다:다 채팅 프로그램은 비동기 입출력 필요=> 파이썬은 select 모듈 제공
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 25
GUI 설계기법
채팅 프로그램 예 – 서버 프로그램채팅 프로그램 예 서버 프로그램
### 채팅 서버 프로그램
from socket import *
# 연결 요청 수락, 연결 소켓 리턴
connectionSocket, addr = serverSocket.accept()
from threading import *
# 메시지 수신 함수(스레드)
()
print("클라이언트 연결됨...", addr, "₩n")
# 스레드 생성 및 실행
( ) ()def serverRecv():
while True:# 데이터 수신하고, 디코드하여 출력
clientMsg = connectionSocket.recv(1024)
Thread(target=serverRecv).start()
while True:
# 송신 데이터 입력clientMsg connectionSocket.recv(1024)
print("[클라이언트] " + clientMsg.decode("utf8") + "₩n")
# 서버 네트워크 연결 초기화
# 송신 데이터 입력
rawData = input()
# 문자열 인코드하여 데이터 송신
connectionSocket.send(rawData.encode("utf8"))# 서버 네트워크 연결 초기화
print("서버 네트워크 연결 초기화 .....")
# 호스트 주소 지정
serverPort = 7000
connectionSocket.close()
serverPort 7000
# 서버 소켓 생성
serverSocket = socket(AF_INET, SOCK_STREAM)
# 주소와 소켓 결합
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 26
serverSocket.bind(('', serverPort))
# 연결 요청 청취
serverSocket.listen(1)
GUI 설계기법
채팅 프로그램 예 – 클라이언트 프로그램채팅 프로그램 예 클라이언트 프로그램
### 채팅 클라이언트 프로그램
f k t i t
# 서버에 연결 요청
li tS k t t(( N P t))from socket import *
from threading import *
# 메시지 수신 함수(스레드)
clientSocket.connect((serverName, serverPort))
print("서버 연결됨...₩n")
# 스레드 생성 및 실행# 메시지 수신 함수(스레드)
def clientRecv():
while True:
# 데이터 수신하고, 디코드하여 출력
# 스레드 생성 및 실행
Thread(target=clientRecv).start()
while True:
serverMsg = clientSocket.recv(1024)
print("[서버] " + serverMsg.decode("utf8") + "₩n")
# 송신 데이터 입력
rawData = input()
# 문자열 인코드하여 데이터 송신
li tS k t d( D t d (" tf8"))clientSocket.close()
# 클라이언트 네트워크 연결 초기화
clientSocket.send(rawData.encode("utf8"))
clientSocket.close()
print("클라이언트 네트워크 연결 초기화 .....")
# 연결할 서버 주소 지정
serverName = '127.0.0.1'
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 27
serverPort = 7000
# 클라이언트 소켓 생성
clientSocket = socket(AF_INET, SOCK_STREAM)
GUI 설계기법
시험주행시험주행
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 28
GUI 설계기법
과제과제
1 앞에서 소개된 채팅 프로그램을 작성하고 실행1. 앞에서 소개된 채팅 프로그램을 작성하고 실행
2 앞에서 배운 내용을 사용한 임의의 프로그램 작성2. 앞에서 배운 내용을 사용한 임의의 프로그램 작성• 프로그램 설명
• 프로그램 소스
• 실행 결과
6. 소켓 프로그래밍과 스레드순천향대학교 컴퓨터공학과 29