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 }