Mercurial > hg > Applications > TightVNC_orginal
comparison src/main/java/ac/ryukyu/treevnc/server/AcceptClient.java @ 11:57ae9fbb1245
add files
author | Taninari YU <you@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 21 Aug 2012 14:02:05 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
10:73abb3b86ce7 | 11:57ae9fbb1245 |
---|---|
1 package ac.ryukyu.treevnc.server; | |
2 | |
3 import java.net.Socket; | |
4 import java.net.UnknownHostException; | |
5 import java.io.*; | |
6 import java.net.*; | |
7 import java.util.*; | |
8 | |
9 public class AcceptClient { | |
10 private int counter = 0, parentnum = 0 /* 落ちたときの親の番号をカウントするためのもの */; | |
11 private LinkedList<String> ls = new LinkedList<String>(); | |
12 private boolean addrRegistor = true; | |
13 private int passNumber=0,numberZone; | |
14 boolean runflag = false; | |
15 //private String name; | |
16 private int passCheck = 0; | |
17 private final int treebranch = 2; // treeの子ノードの数 | |
18 private String newparent,request,myAddress; | |
19 private String leaderflag = "0", sendleaderflag = "0"; | |
20 private final int intv_time = 100; | |
21 | |
22 | |
23 | |
24 public AcceptClient(String name) { | |
25 //this.name = name; | |
26 } | |
27 | |
28 | |
29 /* | |
30 public AcceptClient() { | |
31 new CreateThread(this); | |
32 } | |
33 */ | |
34 | |
35 // public synchronized void transferParentAddrerss(BufferedReader | |
36 // is,PrintStream os) { | |
37 public void transferParentAddrerss(BufferedReader is,PrintStream os) { | |
38 // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す | |
39 try { | |
40 while (true) { | |
41 String line = is.readLine(); | |
42 String port = is.readLine(); | |
43 myAddress = getMyAddress(); | |
44 if ("1".equals(line)||"3".equals(line)) { | |
45 String treeNumber = is.readLine(); | |
46 // reply to Parents lost node | |
47 checkWait(os,is,port,Integer.parseInt(treeNumber)); | |
48 | |
49 } else if ("2".equals(line)) { | |
50 // reply to not Found Parents | |
51 replyNodeInformation(port); | |
52 listupdate(port, newparent); | |
53 outputStream(os, newparent, String.valueOf(parentnum), | |
54 port, leaderflag); | |
55 os.close(); | |
56 is.close(); | |
57 } else if (line!=null){ | |
58 //connection First time | |
59 if(checkAddress(line)){ | |
60 outputStream(os, myAddress,"0","0","0"); | |
61 break; | |
62 }else { | |
63 if(replyCreateTree(os, port, line)) { | |
64 break; | |
65 } else { | |
66 break; | |
67 } | |
68 } | |
69 } | |
70 } | |
71 } catch (IOException e) { | |
72 System.out.println(e); | |
73 } catch (InterruptedException e) { | |
74 e.printStackTrace(); | |
75 } | |
76 } | |
77 | |
78 private boolean checkAddress(String line){ | |
79 String test[] = line.split("\\."); | |
80 int a = Integer.parseInt(test[0]); | |
81 int b = Integer.parseInt(test[1]); | |
82 if((192==a&&b==168)||(172==a&&(b>15||b<32))||10==a) { | |
83 return true; | |
84 } else{ | |
85 return false; | |
86 } | |
87 } | |
88 | |
89 /** | |
90 * @param port | |
91 * parent value | |
92 */ | |
93 private synchronized void listupdate(String port) { | |
94 ls.remove(Integer.parseInt(port)); | |
95 ls.add(Integer.parseInt(port), ls.getLast()); | |
96 ls.removeLast(); | |
97 } | |
98 | |
99 private synchronized void listupdate(String port,String myaddr) { | |
100 ls.remove(Integer.parseInt(port)); | |
101 ls.add(Integer.parseInt(port), myaddr); | |
102 ls.removeLast(); | |
103 } | |
104 | |
105 private void outputStream(PrintStream os, String request, String parentnum, | |
106 String treenum, String leaderflag) { | |
107 os.println(request); | |
108 os.println(parentnum); | |
109 os.println(treenum); | |
110 os.println(leaderflag); | |
111 } | |
112 | |
113 private void checkParameter(int parent, int counter, String leaderflag) { | |
114 System.out.println("number p =" + parentnum); | |
115 System.out.println("number i =" + counter); | |
116 System.out.println("leaderflag=" + leaderflag + "\n"); | |
117 } | |
118 | |
119 private synchronized void addClientAdress(String line, LinkedList<String> ls) { | |
120 if (line != null) { | |
121 ls.add(line); | |
122 } | |
123 //displyLinkedList(ls); | |
124 } | |
125 | |
126 private void displyLinkedList( LinkedList<String> ls) { | |
127 int g = 0; | |
128 for (String bs : ls) { | |
129 System.out.println(g + "number" + bs); | |
130 g++; | |
131 } | |
132 } | |
133 | |
134 private String decisionLeader(int counter, int treebranch) { | |
135 if ((counter - 1) % treebranch == 1) { // children in most young treenum | |
136 // have leaderflag 1 other 0 | |
137 return "0"; | |
138 } else { | |
139 return "1"; | |
140 } | |
141 } | |
142 | |
143 String getMyAddress () { | |
144 InetAddress addr = null; | |
145 try { | |
146 addr = InetAddress.getLocalHost(); | |
147 } catch (UnknownHostException e) { | |
148 e.printStackTrace(); | |
149 } | |
150 return new String(addr.getHostAddress()); | |
151 } | |
152 | |
153 private void replyNodeInformation (String port) { | |
154 parentnum = (Integer.parseInt(port) - 1) / treebranch; | |
155 newparent = ls.get(parentnum); | |
156 sendleaderflag = decisionLeader(Integer.parseInt(port), treebranch); | |
157 //leaderflag = decisionLeader(Integer.parseInt(port),treebranch); | |
158 } | |
159 | |
160 private void replyLeaderNode(PrintStream os,BufferedReader is,String port,String treeNumber) throws IOException, InterruptedException { | |
161 os.println(ls.getLast()); | |
162 replyNodeInformation(port); | |
163 counter--; | |
164 passCheck = 1; | |
165 reportLastNode(ls.getLast(), newparent,port, String.valueOf(parentnum),sendleaderflag); | |
166 listupdate(port); | |
167 waitThread(); | |
168 /* | |
169 if (Integer.parseInt(treeNumber)==ls.size()-1) | |
170 return; | |
171 */ | |
172 //displyLinkedList(ls); | |
173 os.println(port); | |
174 leaderflag = decisionLeader(Integer.parseInt(treeNumber),treebranch); | |
175 os.println(treeNumber); | |
176 Thread.sleep(intv_time); | |
177 is.close(); | |
178 os.close(); | |
179 } | |
180 | |
181 private void replyNormalChildren(PrintStream os,BufferedReader is,String port,String treeNumber,boolean flag) throws IOException, InterruptedException { | |
182 if(flag) | |
183 notifyThread(); | |
184 else | |
185 waitThread(); | |
186 if (Integer.parseInt(treeNumber)==ls.size()) | |
187 return; | |
188 os.println(ls.get(Integer.parseInt(port))); | |
189 os.println(port); | |
190 if(ls.size()-1+passCheck == Integer.parseInt(treeNumber)) | |
191 treeNumber = "skip"; | |
192 passCheck = 0; | |
193 os.println(treeNumber); | |
194 System.out.println("num4="+ ls.get(Integer.parseInt(port))); | |
195 runflag = false; | |
196 is.close(); | |
197 os.close(); | |
198 } | |
199 | |
200 private synchronized boolean replyCreateTree(PrintStream os,String port,String line) throws InterruptedException { | |
201 if (addrRegistor == true) { | |
202 ls.add(myAddress); | |
203 addrRegistor = false; | |
204 } | |
205 | |
206 if (line != null) { | |
207 addClientAdress(line, ls); | |
208 counter++; | |
209 } else { | |
210 return true; | |
211 } | |
212 | |
213 if (counter >= treebranch + 1) { | |
214 leaderflag = decisionLeader(counter, treebranch); | |
215 parentnum = (counter - 1) / treebranch; | |
216 request = ls.get(parentnum); | |
217 System.out.println(parentnum); | |
218 outputStream(os, request,String.valueOf(parentnum), | |
219 String.valueOf(counter), leaderflag); | |
220 checkParameter(parentnum, counter, leaderflag); | |
221 } else { | |
222 // treeの親ノードに接続する人に接続する人を教える | |
223 outputStream(os, myAddress, "0", | |
224 String.valueOf(counter), leaderflag); | |
225 } | |
226 Thread.sleep(intv_time); | |
227 return false; | |
228 } | |
229 | |
230 void reportLastNode(String newchild, String newparent, String newtreenum, | |
231 String newpnum, String newleaderflag) throws IOException { | |
232 try { | |
233 Socket echoSocket; | |
234 System.out.println(newchild + "connect"); | |
235 // echoSocket = new Socket(newchild, 10001 + (i + 1));// | |
236 // i+1は実験中に同じマシーンを使っていたのでportを変えて対応、本番時には取り除く予定。 | |
237 echoSocket = new Socket(newchild, 10001); | |
238 DataOutputStream os = new DataOutputStream(echoSocket.getOutputStream()); | |
239 os.writeBytes(newparent + "\n"); | |
240 os.writeBytes(newpnum + "\n"); | |
241 os.writeBytes(newtreenum + "\n"); | |
242 os.writeBytes(newleaderflag + "\n"); | |
243 os.close(); | |
244 } catch (UnknownHostException e) { | |
245 System.err.println("Don't know about host: localhost"); | |
246 } catch (IOException e) { | |
247 System.err | |
248 .println("Couldn't get I/O for the connection to: localhost"); | |
249 } | |
250 } | |
251 | |
252 void reportFinishFlag(String nextLastNode) { | |
253 Socket echoSocket; | |
254 try { | |
255 echoSocket = new Socket(nextLastNode, 10001); | |
256 DataOutputStream os = new DataOutputStream( | |
257 echoSocket.getOutputStream()); | |
258 os.writeBytes("lastnode" + "\n"); | |
259 } catch (UnknownHostException e) { | |
260 e.printStackTrace(); | |
261 } catch (IOException e) { | |
262 e.printStackTrace(); | |
263 } | |
264 | |
265 } | |
266 | |
267 synchronized void checkWait(PrintStream os,BufferedReader is,String port,int treeNum) throws InterruptedException, IOException { | |
268 final int TIMEOUT = 3000; | |
269 if (passNumber == 0) { | |
270 passNumber++; | |
271 numberZone = ((treeNum - 1) / treebranch); | |
272 //System.out.println(treeNum + "--wait--"); | |
273 replyLeaderNode(os,is,port,String.valueOf(treeNum)); | |
274 notifyAll(); | |
275 passNumber = 0; | |
276 } else if (numberZone == ((treeNum - 1) / treebranch)) { | |
277 if (++passNumber == treebranch) { | |
278 //System.out.println(treeNum + "--notify--"); | |
279 passNumber = 0; | |
280 replyNormalChildren(os,is,port,String.valueOf(treeNum),true); | |
281 } else { | |
282 //System.out.println(treeNum + "--waityobi--"); | |
283 replyNormalChildren(os,is,port,String.valueOf(treeNum),false); | |
284 wait(TIMEOUT); | |
285 } | |
286 } else { | |
287 wait(); | |
288 checkWait(os,is,port,treeNum); | |
289 } | |
290 } | |
291 | |
292 private void waitThread() { | |
293 final int TIMEOUT = 3000; | |
294 try { | |
295 wait(TIMEOUT); | |
296 } catch (InterruptedException e) { | |
297 e.printStackTrace(); | |
298 } | |
299 } | |
300 private void notifyThread() { | |
301 notifyAll(); | |
302 } | |
303 } |