Transcript 강의 13

13주
Case Study
자바프로그래밍
강원대학교
1
TicTacToe 네트워크 게임 설계 및 구현
1단계: 게임 화면을 둘로 나눔
2단계: 네트워크를 통한 게임
자바프로그래밍
강원대학교
2
1단계
자바프로그래밍
강원대학교
3
자바프로그래밍
강원대학교
4
자바프로그래밍
강원대학교
5
자바프로그래밍
강원대학교
6
자바프로그래밍
강원대학교
7
자바프로그래밍
강원대학교
8
자바프로그래밍
강원대학교
9
아래 과정을 반복
TicTacToeFrame
TicTacToeFrame
click!
end?
<no>
TicTacToe
자바프로그래밍
강원대학교
10
TicTacToeFrame
TicTacToeFrame
click!
end?
<yes>
TicTacToe
자바프로그래밍
강원대학교
11
자바프로그래밍
강원대학교
12
자바프로그래밍
강원대학교
13
2 단계
• 서버 스타트
• 클라이언트1 스타트
자바프로그래밍
강원대학교
14
클라이언트2 스타트
자바프로그래밍
강원대학교
15
클라이언트3 스타트
자바프로그래밍
강원대학교
16
클라이언트4 스타트
자바프로그래밍
강원대학교
17
자바프로그래밍
강원대학교
18
자바프로그래밍
강원대학교
19
자바프로그래밍
강원대학교
20
자바프로그래밍
강원대학교
21
TicTacToeFrame
TicTacToeFrame
클라이언트
서버
클라이언트와 서버간 메소드 직접 호출 불가!
메세지 송수신을 통해 소통 (프로토콜)
TicTacToe
자바프로그래밍
강원대학교
22
TicTacToeFrame
TicTacToeFrame
TicTacToeFrame
클라이언트
여러 클라이언트 쌍들을 서비스하기 위해 멀티쓰레딩 서버 필요
두 클라이언트 접속 요청마다 이들에 대응되는 TicTacToe 객체 구성
서버
TicTacToe
자바프로그래밍
TicTacToe
강원대학교
GameServer
23
TicTacToeFrame
TicTacToeFrame
ClientReceiver
ClientReceiver
네트워크로부터의 입력을 지속적으로 감시하여 입력을 처리하는 작업과
클릭이 발생하면 화면을 처리하고 서버쪽으로 메세지를 보내는 작업이
병렬로 진행되어야 함  네트워크 입력 감시 작업을 별도의 쓰레드로 실행시킴
ServerReceiver
ServerReceiver
TicTacToe
자바프로그래밍
강원대학교
24
TicTacToeFrame
TicTacToeFrame
ClientReceiver
ClientReceiver
두 클라이언트로부터의 입력을 지속적으로 감시하여 입력을 처리하는 작업을
병렬로 진행해야  각 클라이언트로부터의 입력 감시 작업을 별도의 쓰레드로 실행시킴
ServerReceiver
ServerReceiver
TicTacToe
자바프로그래밍
강원대학교
25
TicTacToeFrame
TicTacToeFrame
ClientReceiver
ClientReceiver
스트림
소켓
소켓
스트림
ServerReceiver
ServerReceiver
TicTacToe
자바프로그래밍
강원대학교
26
TicTacToeFrame
click!
TicTacToeFrame
ClientReceiver
ClientReceiver
네트워크를 통한 메세지
메소드 호출
ServerReceiver
ServerReceiver
TicTacToe
자바프로그래밍
강원대학교
27
TicTacToeFrame
TicTacToeFrame
ClientReceiver
ClientReceiver
ServerReceiver
click!
ServerReceiver
TicTacToe
자바프로그래밍
강원대학교
28
TicTacToeFrame
TicTacToeFrame
ClientReceiver
ClientReceiver
click!
• 클릭  이벤트 처리 쓰레드가 set 메세지를 만들어 네트워크를 통해 ServerReceiver로 전송
• ServerReceiver와 ClientReceiver는 쓰레드이며
평소에는 네트워크 입력을 기다리며 block되어 있는 상태이고
네트워크를 통해 메세지가 들어 오면 이를 분석하여 메세지 종류에 따라 적절한 메소드 호출
ServerReceiver
ServerReceiver
TicTacToe
자바프로그래밍
강원대학교
29
TicTacToeFrame
ClientReceiver
• 클라이언트는 ClientReceiver 쓰레드를 start 시킨 후 TicTacToeServer에 접속
• 클라이언트로부터 접속 요청이 두 개 들어 오면
서버를 구성하여 ServerReceiver 쓰레드 두 개를 start시킴
ServerReceiver
ServerReceiver
TicTacToe
GameServer
자바프로그래밍
강원대학교
30
두 클라이언트에게 각각 O 혹은 X를 지정하고
한쪽을 enable시킴  게임 시작
GameServer
자바프로그래밍
강원대학교
31
게임 승부가 나면 각 클라이언트에게 알림
클라이언트가 종료하면 스트림이 닫히고 ServerReceiver가 이를 감지하고 종료함
두 쓰레드가 종료하면 TicTacToe 객체도 자연히 소멸됨
GameServer
자바프로그래밍
강원대학교
32
TicTacToeFrame
자바프로그래밍
강원대학교
33
메세지 형식
• 클라이언트  서버
– set i j X
• 서버  클라이언트
– set i j X
– enable
– setPlayer X
– endGame X
자바프로그래밍
강원대학교
34
• 두 개의 쓰레드가 TicTacToe에 병렬로 접근하여 TicTacToe의 상태를 변경시키므로
• Race condition이 발생하므로 동기화 기법이 적용되어야 함
• 그러나 이 예에서는 두 클라이언트가 동시에 활성화되는 일이 없으므로 동기화 생략
ServerReceiver
ServerReceiver
TicTacToe
자바프로그래밍
강원대학교
35
쓰레드에 대한 보충
Thread
Printer
String id
work()
자바프로그래밍
Controller
Printer p1, p2, p3
run()
강원대학교
36
Printer
public class Printer {
private String id;
public Printer(String s) {
id = s;
}
public void work() {
Thread t = Thread.currentThread();
System.out.println(t.getName() + ": printer " + id);
}
}
자바프로그래밍
강원대학교
37
public class Controller extends Thread {
private Printer p1, p2, p3;
public Controller(Printer p1, Printer p2, Printer p3) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
public void run() {
try {
while(true) {
p1.work();
Thread.sleep(1000);
p2.work();
Thread.sleep(1000);
p3.work();
Thread.sleep(1000);
}
} catch (InterruptedException e){}
}
}
Controller
자바프로그래밍
강원대학교
38
public static void main(String[] args) {
Printer p1 = new Printer("1");
Printer p2 = new Printer("2");
Printer p3 = new Printer("3");
Controller t1 = new Controller(p1, p2, p3);
t1.setName("First Thread");
Controller t2 = new Controller(p1, p2, p3);
t2.setName("Second Thread");
t1.start();
t2.start();
}
자바프로그래밍
강원대학교
39
First Thread: printer 1
Second Thread: printer
Second Thread: printer
First Thread: printer 2
Second Thread: printer
First Thread: printer 3
Second Thread: printer
First Thread: printer 1
First Thread: printer 2
Second Thread: printer
First Thread: printer 3
Second Thread: printer
자바프로그래밍
1
2
3
1
2
3
강원대학교
40