19
소켓 프로그래밍과 쓰레드 순천향대학교 컴퓨터공학과 순천향대학교 컴퓨터공학과 이상정 순천향대학교 컴퓨터공학과 1 GUI 설계기법 학습 내용 학습 내용 인터넷 구조 인터넷 구조 인터넷 구성 요소 인터넷 주소 클라이언트/서버 구조 소켓 프로그래밍 소개 파이썬 소켓 프로그래밍 TCP 클라이언트/서버 프로그래밍 쓰레 소개 쓰레소개 파이썬 쓰레드 채팅 클라이언트/서버 프로그램 채팅 클라이언트/서버 프로그램 네트워크 그리드 셀 네트워크 연결 그리드 그리기 소켓 프로그래밍과 쓰레드 네트워크 연결 그리드 그리기 순천향대학교 컴퓨터공학과 2

소켓프로그래밍과쓰레드 - SCHcs.sch.ac.kr/lecture/Python/2013/13-9-PythonGUI-network.pdf · 2013-11-04 · •클라이언트와통신을위한새로운연결소켓과클라이언트의주소를

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

소켓 프로그래밍과 쓰레드

순천향대학교 컴퓨터공학과순천향대학교 컴퓨터공학과

이 상 정

순천향대학교 컴퓨터공학과 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 주소, 포트) 튜플

연결 요청 청취• 클라이언트로부터 소켓 연결 요청을 청취

• socket.listen(backlog) 메소드

• backlog: 허용되는 최대 요청 수• 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 = client_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) 받을 때까지 프로그램이 블록킹(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 인코드/디코드

• 문제점

• 수신 문자가 바로 출력되지 않음• 수신 문자가 바로 출력되지 않음

• 저수준 및 비동기 입출력 필요

소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 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

GUI 설계기법

시험주행 - 클라이언트시험주행 클라이언트

소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 37

GUI 설계기법

과제과제

1 앞에서 소개된 프로그램을 작성하고 실행1. 앞에서 소개된 프로그램을 작성하고 실행

2 앞에서 배운 내용을 사용한 임의의 프로그램 작성2. 앞에서 배운 내용을 사용한 임의의 프로그램 작성• 프로그램 설명

• 프로그램 소스

• 실행 결과

소켓 프로그래밍과 쓰레드순천향대학교 컴퓨터공학과 38