-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMediator.java
More file actions
270 lines (215 loc) · 8.91 KB
/
Mediator.java
File metadata and controls
270 lines (215 loc) · 8.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
public class Mediator {
//Mediatorは日本語で仲介者
PlayerUI ui;
PlayerInfo info;
Connector connect;
Message answerMessage;
private int portN = 8080;
Mediator(){
ui = new PlayerUI();
info = new PlayerInfo();
}
public void SetNickName(){
ui.Println("これから15点のゲームを始めます。まずはあなたのニックネームを教えてください。(半角英数字のみでお願いします)");
String name = ui.GetSCStr();
info.SetNickName(name);
ui.Println(name+"さん、こんにちは!");
}
public void SetPortN(){
ui.Println("ポート番号を入力してください");
String portNStr = ui.GetSCStr();
try{
portN = Integer.parseInt(portNStr);
//port番号が不適合の場合の処理
if(portN<0||65535<portN){
ui.Println("ポート番号は0-65535の範囲で指定してください");
SetPortN();
}
}catch(NumberFormatException e){
ui.Println("整数を入力してください");
SetPortN();
}
}
public void StartConnection(){
char[] ansData = {'b','s'};
char ans = ui.QA("対戦部屋を作りますか?探しますか?\n対戦部屋を作る(build)場合は「b」、探す(search)場合は「s」と入力してください。",ansData);
ui.Println("通信を開始します。");
SetConnection(ans);
}
public void SetConnection(char makeSearch){
if(makeSearch == 'b'){
//Server側を選択
connect = new JabberServer(portN);
info.SetIAm('s');
}else if(makeSearch == 's'){
//Client側を選択
connect = new JabberClient(portN);
info.SetIAm('c');
}else{
System.out.println("makeSearchの値が"+makeSearch+"です。「make」「search」の引数が必要です。");
}
}
//クライアントの場合はサーバーからの応答を待つ
public void StartClientWait(){
Message mes = new Message();
while(true){
mes = connect.Wait();
if(mes !=null){
GetMessage(mes);//自分当てのMessageを受け取った時に、mesの種類を確認し、適切な処理を行う関数
if(mes.type.equals("END")){
//javaでのstringの比較は==ではなく.equals(==はアドレスの比較になる)
break;
}
}
}
}
public void Close(){
//ここにClose処理を書く
ui.EndGame();
connect.Close();
}
//自分当てのMessageを受け取った時に、mesの種類を確認し、適切な処理を行う関数
public void GetMessage(Message mes){
switch(mes.type){
case "TXT":
ui.Println(mes.txt);
break;
case "QUE":
char ans = ui.QA(mes.txt, mes.ansData);
SendToServer("ANS", String.valueOf(ans));//Serverに送るというよりもGameRoomに送るという感覚
break;
case "NAM":
//ニックネーム取得処理
SendToServer("ANS", info.GetNickName());
case "ANS":
answerMessage = mes;
break;
case "END":
Close();
break;
default:
System.out.println("error:mesのtypeが"+mes.type+"です。GetMessage()のswitch文を確認してください");
}
}
//ここから先は通信の送受信についての関数群
public void SendToAll(String type, String txt){
//System.out.println("test:全員へ");
char[] x = {'x'};//数合わせ
SendToServer(type,txt,x);
SendToClient(type,txt,x);
}
public void SendToAll(String type, String txt,char[] ansData){
//System.out.println("test:全員へ");
SendToServer(type,txt,ansData);
SendToClient(type,txt,ansData);
}
//"QUE"以外の時
public void SendToServer(String type, String txt){
char[] x = {'x'};//数合わせ
SendToServer(type, txt,x);
}
public void SendToServer(String type, String txt,char[] ansData){
//System.out.println("test:Serverへ");
Message mes = new Message();
mes.type = type;
mes.txt = txt;
mes.ansData = ansData;
if(info.GetIAm()=='s'){
//自分自身がサーバーで、サーバー宛にmesを送る→自分当てのmesを受け取ったと解釈
GetMessage(mes);//自分当てのMessageを受け取った時に、mesの種類を確認し、適切な処理を行う関数
}else if (info.GetIAm()=='c'){
connect.Send(mes);
}else{
System.out.println("error:iAmがs,cではありません");
}
}
public void SendToClient(String type, String txt){
char[] x = {'x'};//数合わせ
SendToClient(type, txt, x);
}
//SendToServer()と同じようなコードなので、SendToServer()を参照してください
//同じようなコードなら、そもそも関数名でServerかClientかを判断するのでなく、引数でServerかClientかを判断できるようにするべきだった...
public void SendToClient(String type, String txt,char[] ansData){
//System.out.println("test:Clientへ");
Message mes = new Message();
mes.type = type;
mes.txt = txt;
mes.ansData = ansData;
if(info.GetIAm()=='s'){
connect.Send(mes);
}else if (info.GetIAm()=='c'){
GetMessage(mes);
}else{
System.out.println("error:iAmがs,cではありません");
}
}
//異なるmesを同時に送る時に使おうと思っていたが、結局使わなかったのでコメントアウト
/* public void DiffSendToSC(Message serverMes,Message crientMes){
SendToServer(serverMes);
SendToClient(crientMes);
}*/
//ANSのmessageを受け取った時に、その内容を取得するために呼び出す
//Server側が使う前提で作ってあるので、Client側で使う場合は拡張が必要
public Message GetAnserMessage(char fromSOrc){
//clientからの時はwaitを呼び出す必要がある
if(fromSOrc == 'c'){
WaitServer();
}
return answerMessage;
}
public Message Wait(char sOrc){
Message retMes;
if(sOrc=='s'){
retMes = WaitServer();
}else if(sOrc=='c'){
retMes = WaitCLient();
}else{
System.out.println("エラー:sOrcの値が"+sOrc+"です。");
retMes = new Message();
retMes.txt = "error";
}
return retMes;
}
public Message WaitServer(){
// System.out.println("test:ServerへWait命令");
Message retMes;
if(info.GetIAm()=='s'){
retMes = connect.Wait();
GetMessage(retMes);
}else if (info.GetIAm()=='c'){
//サーバーに対してクライアントが待てと命令することはないという前提
System.out.println("error:サーバーに対してクライアントが待てと命令することはないという前提");
retMes = new Message();
retMes.txt = "error";
}else{
System.out.println("error:iAmがs,cではありません");
retMes = new Message();
retMes.txt = "error";
}
return retMes;
}
public Message WaitCLient(){
//System.out.println("test:ClientへWait命令");
Message retMes;
if(info.GetIAm()=='s'){
//サーバーからクライアントへ待機命令
System.out.println("test:サーバーからクライアントへ待機命令");
retMes = new Message();
retMes.txt = "error";
}else if (info.GetIAm()=='c'){
retMes = connect.Wait();
GetMessage(retMes);
}else{
System.out.println("error:iAmがs,cではありません");
retMes = new Message();
retMes.txt = "error";
}
return retMes;
}
public void End(){
//end処理は特別扱い。これはENDを送信するためのコード
//System.out.println("test:end処理");
SendToClient("END","-1");
SendToServer("END","-1");
}
}