소켓 프로그래밍과 쓰레드
순천향대학교 컴퓨터공학과순천향대학교 컴퓨터공학과
이 상 정
순천향대학교 컴퓨터공학과 1
GUI 설계기법
학습 내용학습 내용
인터넷 구조 인터넷 구조• 인터넷 구성 요소
• 인터넷 주소
• 클라이언트/서버 구조
소켓 프로그래밍 소개• 파이썬 소켓 프로그래밍
• TCP 클라이언트/서버 프로그래밍
쓰레 소개 쓰레드 소개• 파이썬 쓰레드
• 채팅 클라이언트/서버 프로그램• 채팅 클라이언트/서버 프로그램
네트워크 그리드 셀 예• 네트워크 연결 그리드 그리기
소켓 프로그래밍과 쓰레드
네트워크 연결 그리드 그리기
순천향대학교 컴퓨터공학과 2
GUI 설계기법
구성요소로 본 인터넷 (1)구성요소로 본 인터넷 (1)
호스트(host) 종단 시스템(end system) 호스트(host), 종단 시스템(end system)• 컴퓨터 네트워크에 연결된 컴퓨팅 장치
• 네트워크 응용들을 수행
통신 링크(communication link)• 동축케이블, 광케이블,구리선, 전파, 위성
• 다양한 전송률(transmission rate, 또는 bandwidth)로 데이터(패킷) 전송또는 bandwidth)로 데이터(패킷) 전송
패킷 스위치(packet switch) 패킷 스위치(packet switch)• 라우터(router), 스위치(switch)
• 패킷을 전달
소켓 프로그래밍과 쓰레드
패킷을 전달
순천향대학교 컴퓨터공학과 3
GUI 설계기법
구성요소로 본 인터넷 (2)구성요소로 본 인터넷 (2)
인터넷(Internet) 인터넷(Internet)• 네트워크들의 네트워크
(network of networks)
프로토콜(protocol)• 정보(메시지)의 송수신을 제어
• 예TCP(Transmission Control protocol), IP(Internet Protocol),( ),HTTP, SMTP, 이더넷(Ethernet)
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 4
GUI 설계기법
네트워크 요소네트워크 요소
네트워크 가장자리(edge) 네트워크 가장자리(edge)• 호스트: 클라이언트와 서버
• 데이터 센터 내의 서버들
접속 네트워크(access network),속 네 워 ( ),물리 매체(physical media)• 유무선 통신 링크
네트워크 코어(core)• 라우터
• 네트워크들의 네트워크
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 5
GUI 설계기법
클라이언트/서버 구조클라이언트/서버 구조
서버 (server) 서버 (server)• 항상 켜져 있는 호스트
• 서비스 제공
• 고정 IP 주소
• 데이터 센터로 확장
클라이언트 (client)• 서버와 통신• 서버와 통신
• 서비스 요청
• 클라이언트들 간 직접 통신하지 않음
• 유동 IP 가질 수 있음
• 항상 연결되어 있지 않고 간헐적으로통신할 수 있음
소켓 프로그래밍과 쓰레드
통신할 수 있음
순천향대학교 컴퓨터공학과 6
GUI 설계기법
인터넷 주소인터넷 주소
인터넷 주소는 IP 주소와 포트 번호로 구분 인터넷 주소는 IP 주소와 포트 번호로 구분
IP 주소• 호스트/라우터 주소호스트/라우터 주소
• IPv4 주소: 32 비트
• 32 비트 IP 주소 공간이 빠른 속도로 고갈되어 가고 있음I 6 128 비트=> IPv6: 128 비트
포트 번호 포트 번호• 호스트 내의 프로세스(프로그램)을 구분하는 번호
• 예
• HTTP 서버: 80, 메일 서버: 25
• 인터넷 표준 프로토콜에 대한 알려진(well-known) 포트번호 리스트는 www iana org 참조
소켓 프로그래밍과 쓰레드
는 www.iana.org 참조
순천향대학교 컴퓨터공학과 7
GUI 설계기법
소켓 (Socket)소켓 (Socket)
프로세스는 소켓(socket)을 통해 네트워크로 메시지를 송수신 프로세스는 소켓(socket)을 통해 네트워크로 메시지를 송수신• 소켓은 호스트의 애플리케이션 계층과 트랜스포트 계층 간의
인터페이스
• 프로세스는 집(house), 소켓은 출입구(door)에 비유
• 송신 프로세스는 출입구(소켓) 바깥 네트워크로 메시지를 밀어냄
• 소켓은 애플리케이션과 네트워크 사이의 API(Application• 소켓은 애플리케이션과 네트워크 사이의 API(Application Programming Interface)
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 8
GUI 설계기법
소켓 프로그래밍소켓 프로그래밍
두 가지 형태의 트랜스포트 서비스 두 가지 형태의 트랜스포트 서비스• UDP: 비연결형, 비신뢰적인 데이터 전송
• TCP: 연결형, 신뢰적인 데이터 전송,
TCP 소켓 프로그래밍• 서버 프로세스가 먼저 수행 중에 있어야 함
• 서버는 클라이언트의 초기 접속을 처리하는 소켓을 생성해야 함
클라이언트는 서버에 초기 접속• 클라이언트는 서버에 초기 접속
• 클라이언트는 TCP 소켓을 생성하고, 서버 프로세스의 IP 주소와 포트 번호를 명시하여 서버에 접속
• 서버는 클라이언트에 의해 초기 접속 클라이언트와 통신하는 서버 프로세스를 위한 새로운 소켓(연결 소켓)을 생성
• 서버와 클라이언트가 데이터 송수신
소켓 프로그래밍과 쓰레드
서버와 클라이언트가 데이터 송수신
순천향대학교 컴퓨터공학과 9
GUI 설계기법
TCP 클라이언트/서버 소켓 상호동작TCP 클라이언트/서버 소켓 상호동작
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 10
GUI 설계기법
TCP 클라이언트/서버 소켓 상호동작 – 파이썬TCP 클라이언트/서버 소켓 상호동작 파이썬
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 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() 메소드
소켓 프로그래밍과 쓰레드
• 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)• 클라이언트와 통신을 위한 새로운 연결 소켓과 클라이언트의 주소를
소켓 프로그래밍과 쓰레드
클라이언트와 통신을 위한 새로운 연결 소켓과 클라이언트의 주소를리턴
순천향대학교 컴퓨터공학과 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)
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 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))
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 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)
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 16
print(data)
GUI 설계기법
TCP 소켓 프로그램 예 소개TCP 소켓 프로그램 예 소개
1 클라이언트는 키보드로 한 줄의 문자(데이터)를 읽고 그 데1. 클라이언트는 키보드로 한 줄의 문자(데이터)를 읽고, 그 데이터를 서버로 송신
2 서버는 데이터를 수신하고 문자를 대문자로 변환2. 서버는 데이터를 수신하고, 문자를 대문자로 변환
3. 서버는 수정된 데이터를 클라이언트에게 송신
4 클라이언트는 수정된 데이터를 수신하고 화면에 출력4. 클라이언트는 수정된 데이터를 수신하고 화면에 출력
한 컴퓨터에서 2개의 파이썬 셀 수행하여 클라이언트/서버 한 컴퓨터에서 2개의 파이썬 셀 수행하여 클라이언트/서버통신• 자기 자신을 나타내는 루프백(loopback) 주소 사용
127.0.0.1
• 윈도우에서 자기 자신의 주소를 알려면 콘솔창에서 ipconfig 명령c> ipconfig
소켓 프로그래밍과 쓰레드
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()
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 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"))
# 데이터 수신
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 19
# 데이터 수신
modifiedStr = clientSocket.recv(1024)
print("from server: " , modifiedStr)
GUI 설계기법
시험주행시험주행
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 20
GUI 설계기법
TCP 프로그램 예 동작 검토TCP 프로그램 예 동작 검토
앞의 예제 프로그램의 예제• 서버 프로그램에서 같은 클라이언트 연결에 대해서도 매번 연결 요청
수락
루프 내에서 연결 요청 수락• 루프 내에서 연결 요청 수락
• 클라이언트 한 번 데이터 송수신 후 종료
• 데이터 수신 시 동작데이터 수신 시 동작
• 데이터 수신 시 데이터를 받을 때까지 프로그램이 블록킹(blocking)
• 데이터 수신 까지 프로그램이 다른 동작을 못함
개선된 프로그램 – 채팅 프로그램• 한 번 연결 수락으로 클라이언트 종료하지 않고 계속 데이터 송수신
루프 밖에서 연결 요청 수락• 루프 밖에서 연결 요청 수락
• 데이터 수신 블록킹 문제
• 데이터 수신 동작을 독자적인 프로그램(쓰레드)로 실행하여 해결
소켓 프로그래밍과 쓰레드
데이터 수신 동작을 독자적인 프로그램(쓰레드)로 실행하여 해결
순천향대학교 컴퓨터공학과 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() 메소드
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 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))
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 23
th.start()
GUI 설계기법
시험주행시험주행
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 24
GUI 설계기법
채팅 프로그램 예채팅 프로그램 예
클라이언트와 서버가 서로 문자를 주고 받는 채팅 프로그램 클라이언트와 서버가 서로 문자를 주고 받는 채팅 프로그램예• 한 번 연결 수락으로 클라이언트 종료하지 않고 계속 데이터 송수신
• 루프 밖에서 연결 요청 수락
• 데이터 수신 동작을 독자적인 프로그램(쓰레드)로 실행
• 한글 송수신을 위해 UTF16 인코드/디코드
• 문제점
• 수신 문자가 바로 출력되지 않음• 수신 문자가 바로 출력되지 않음
• 저수준 및 비동기 입출력 필요=> 파이썬은 asynchat 모듈 제공
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 25
GUI 설계기법
채팅 프로그램 예 – 서버 프로그램채팅 프로그램 예 서버 프로그램
### 채팅 서버 프로그램
f k t i t
# 연결 요청 수락, 연결 소켓 리턴
ti S k t dd S k t t()from socket import *
from threading import *
# 메시지 수신 함수(쓰레드)
connectionSocket, addr = serverSocket.accept()
print("클라이언트 연결됨...", addr, "₩n")
# 쓰레드 생성 및 실행# 메시지 수신 함수(쓰레드)
def serverRecv():
while True:# 데이터 수신하고, 디코드하여 출력
# 쓰레드 생성 및 실행
Thread(target=serverRecv).start()
while True:clientMsg = connectionSocket.recv(1024)
print("**" + clientMsg.decode("utf16")+"₩n")
# 서버 네트워크 연결 초기화
# 송신 데이터 입력
rawData = input()
# 문자열 인코드하여 데이터 송신
ti S k t d( D t d (" tf16"))# 서버 네트워크 연결 초기화
print("서버 네트워크 연결 초기화 .....")
# 호스트 주소 지정
serverPort = 7000
connectionSocket.send(rawData.encode("utf16"))
connectionSocket.close()
# 서버 소켓 생성
serverSocket = socket(AF_INET, SOCK_STREAM)
# 주소와 소켓 결합
(('' ))
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 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("utf16")+"₩n")
li tS k t l ()
# 송신 데이터 입력
rawData = input()
# 문자열 인코드하여 데이터 송신
li tS k t d( D t d (" tf16"))clientSocket.close()
# 클라이언트 네트워크 연결 초기화
print("클라이언트 네트워크 연결 초기화 .....")
clientSocket.send(rawData.encode("utf16"))
clientSocket.close()
print( 클라이언트 네트워크 연결 초기화 ..... )
# 연결할 서버 주소 지정
serverName = '127.0.0.1'
serverPort = 7000
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 27
# 클라이언트 소켓 생성
clientSocket = socket(AF_INET, SOCK_STREAM)
GUI 설계기법
시험주행시험주행
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 28
GUI 설계기법
네트워크 그리드 예 - 소개네트워크 그리드 예 소개
7장의 배열 기반 그리드를 네트워크 버전으로 개선 7장의 배열 기반 그리드를 네트워크 버전으로 개선• 클릭한 셀의 2차원 배열 인덱스 값을 네트워크 데이터로 송수신
• 클라이언트, 서버의 클릭한 그리드 값(색) 구분, ( )빈 공간: 0 (흰색), 서버: 1 (녹색), 클라이언트: 2 (적색)
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 29
GUI 설계기법
네트워크 그리드 예 – 데이터 송신네트워크 그리드 예 데이터 송신
마우스 클릭 시 데이터 송신 마우스 클릭 시 데이터 송신• 송신 시 리스트를 바이트형으로 변환하여 송신
# 서버 송신# 서버 송신
if event.type == pygame.MOUSEBUTTONDOWN:
……
# 그리드 값 1(서버)로 지정# 그리드 값 1(서버)로 지정
grid[row][column]=1
# 서버 인덱스를 바이트로 변환하여 송신
serverIndex = [row column]
# 클라이언트 송신
if event.type == pygame.MOUSEBUTTONDOWN:serverIndex = [row, column]
indexBytes = bytes(serverIndex)
connectionSocket.send(indexBytes)
……
# 그리드 값 2(클라이언트)로 지정
grid[row][column]=2……
g
# 클라이언트 인덱스를 바이트로 변환하여 송신
clientIndex = [row, column]
indexBytes = bytes(clientIndex)
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 30
y y ( )
clientSocket.send(indexBytes)
……
GUI 설계기법
네트워크 그리드 예 – 데이터 수신네트워크 그리드 예 데이터 수신
쓰레드 함수로 구현 쓰레드 함수로 구현• 수신 시 바이트 데이터를 리스트 형으로 변환 후 그리드 표시
# 서버 메시지 수신 함수(쓰레드)# 서버 메시지 수신 함수(쓰레드)
def serverRecv():
while True:
# 클라이언트의 클릭 배열 인덱스 수신 후리스트형으로 변환
# 클라이언트 메시지 수신 함수(쓰레드)
def clientRecv():# 리스트형으로 변환
clientIndex = list(connectionSocket.recv(1024))
row = clientIndex[0]
column = clientIndex[1]
def clientRecv()
while True:
# 서버의 클릭 배열 인덱스 수신 후# 리스트형으로 변환
( ( ))column clientIndex[1]
# 그리드 값 2(클라이언트)로 지정
grid[row][column] = 2
serverIndex = list(clientSocket.recv(1024))
row = serverIndex[0]
column = serverIndex[1]
# 그리드 값 1(서버)로 지정# 쓰레드 생성 및 실행
Thread(target=serverRecv).start()
# 그리드 값 1(서버)로 지정
grid[row][column] = 1
# 쓰레드 생성 및 실행
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 31
Thread(target=clientRecv).start()
GUI 설계기법
네트워크 그리드 예 – 서버 프로그램네트워크 그리드 예 서버 프로그램### 그리드 서버 프로그램
import pygame
# 그리드 값 2(클라이언트)로 지정
grid[row][column] = 2
from socket import *
from threading import *
black = ( 0 0 0)
print("Receive, Grid Client Index: ",row,column)
# 2차원 배열 생성
# 2차원 배열은 리스트의 리스트 0: 빈공간black = ( 0, 0, 0)
white = ( 255, 255, 255)
green = ( 0, 255, 0)
red = ( 255, 0, 0)
# 2차원 배열은 리스트의 리스트, 0: 빈공간,
# 1: 서버, 2: 클라이언트
grid=[]
for row in range(10):
# 그리드 크기 지정
width=20
height=20
# 행을 위한 빈 배열 추가
grid.append([])
for column in range(10):
[ ] ( )# 그리드 셀 간 여백
margin=5
# 서버 메시지 수신 함수(쓰레드)
def serverRecv():
grid[row].append(0) # 열을 추가
# 서버 네트워크 연결 초기화
print("Server TCP initialize ")def serverRecv():
while True:
# 클라이언트의 클릭 배열 인덱스 수신 후# 리스트형으로 변환
print( Server TCP initialize... )
# 호스트 주소 지정
serverPort = 7000
# 서버 소켓 생성
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 32
clientIndex = list(connectionSocket.recv(1024))
row = clientIndex[0]
column = clientIndex[1]
serverSocket = socket(AF_INET, SOCK_STREAM)
# 주소와 소켓 결합
serverSocket.bind(('', serverPort))
GUI 설계기법# 연결 요청 청취
serverSocket.listen(1)
# 연결 요청 수락, 연결 소켓 리턴
ti S k t dd S k t t()
print("Click ",pos,"Grid Server Index: ", row,column)
# 서버 인덱스를 바이트로 변환하여 송신
I d [ l ]connectionSocket, addr = serverSocket.accept()
print("Client connected...", addr)
# 쓰레드 생성 및 실행
Thread(target=serverRecv).start()
serverIndex = [row, column]
indexBytes = bytes(serverIndex)
connectionSocket.send(indexBytes)
print("Send, Grid Server Index: ",Thread(target serverRecv).start()
pygame.init()
# 윈도우 설정
size=[255,255]
print( Send, Grid Server Index , row,column)
# 그리드 그리기
screen.fill(black)
( )screen=pygame.display.set_mode(size)
pygame.display.set_caption("서버 그리드")
done=False
clock=pygame time Clock()
for row in range(10):
for column in range(10):
color = white
# 서버 클릭 그리드 값 색 지정clock pygame.time.Clock()
while done==False:
for event in pygame.event.get():
# 서버 클릭 그리드 값 색 지정
if grid[row][column] == 1:
color = green
# 클라이언트 클릭 그리드 값 색 지정
if event.type == pygame.QUIT:
done=True
if event.type == pygame.MOUSEBUTTONDOWN:
# 마우스 클릭 위치
elif grid[row][column] == 2:
color = red pygame.draw.rect(screen,color,
[(margin+width)*column+margin# 마우스 클릭 위치
pos = pygame.mouse.get_pos()
# x,y 스크린 좌표를 그리드 좌표로 변환
column=pos[0] // (width+margin)
[(margin+width)*column+margin,(margin+height)*row+margin,width,height])
clock.tick(20)
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 33
column pos[0] // (width+margin)
row=pos[1] // (height+margin)
# 그리드 값 1(서버)로 지정
grid[row][column]=1
pygame.display.flip()
pygame.quit()
GUI 설계기법
네트워크 그리드 예 – 클라이언트 프로그램네트워크 그리드 예 클라이언트 프로그램import pygame
from socket import *
# 그리드 값 1(서버)로 지정
grid[row][column] = 1
from threading import *
black = ( 0, 0, 0)
white = ( 255 255 255)
print("Receive, Grid Server Index: ",row,column)
# 2차원 배열 생성
# 2차원 배열은 리스트의 리스트 0: 빈공간white = ( 255, 255, 255)
green = ( 0, 255, 0)
red = ( 255, 0, 0)
# 그리드 크기 지정
# 2차원 배열은 리스트의 리스트, 0: 빈공간,
# 1: 서버, 2: 클라이언트
grid=[]
for row in range(10):
width=20
height=20
# 그리드 셀 간 여백
# 행을 위한 빈 배열 추가
grid.append([])
for column in range(10):
[ ] ( )margin=5
# 클라이언트 메시지 수신 함수(쓰레드)
def clientRecv():
grid[row].append(0) # 열을 추가
# 클라이언트 네트워크 연결 초기화
print("Client TCP initialize ")def clientRecv():
while True:
# 서버의 클릭 배열 인덱스 수신 후# 리스트형으로 변환
print( Client TCP initialize... )
# 연결할 서버 주소 지정
serverName = '127.0.0.1'
serverPort = 7000
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 34
serverIndex = list(clientSocket.recv(1024))
row = serverIndex[0]
column = serverIndex[1]
# 클라이언트 소켓 생성
clientSocket = socket(AF_INET, SOCK_STREAM)
GUI 설계기법 print("Click ",pos,"Grid Server Index: ",row,column)
# 클라이언트 인덱스를 바이트로# 변환하여 송신
# 서버에 연결 요청
clientSocket.connect((serverName, serverPort))
print("Server connected...")# 변환하여 송신
clientIndex = [row, column]
indexBytes = bytes(clientIndex)
clientSocket.send(indexBytes)
# 쓰레드 생성 및 실행
Thread(target=clientRecv).start()
pygame init()print("Send, Grid Client Index: ",
row,column)
# 그리드 그리기
screen fill(black)
pygame.init()
# 윈도우 설정
size=[255,255]
screen=pygame.display.set_mode(size)screen.fill(black)
for row in range(10):
for column in range(10):
color = white
pygame.display.set_caption("클라이언트 그리드")
done=False
clock=pygame.time.Clock()color white
# 서버 클릭 그리드 값 색 지정
if grid[row][column] == 1:
color = green
while done==False:
for event in pygame.event.get():
if event type == pygame QUIT:# 클라이언트 클릭 그리드 값 색 지정
elif grid[row][column] == 2:
color = red
pygame draw rect(screen color
if event.type pygame.QUIT:
done=True
if event.type == pygame.MOUSEBUTTONDOWN:
# 마우스 클릭 위치pygame.draw.rect(screen,color,
[(margin+width)*column+margin,(margin+height)*row+margin,width,height])
clock.tick(20)
pos = pygame.mouse.get_pos()
# x,y 스크린 좌표를 그리드 좌표로 변환
column=pos[0] // (width+margin)
[1] // (h i ht i )
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 35
pygame.display.flip()
pygame.quit()
row=pos[1] // (height+margin)
# 그리드 값 2(클라이언트)로 지정
grid[row][column]=2
GUI 설계기법
시험주행 - 서버시험주행 서버
소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 36