12
|
1 package jp.ac.u_ryukyu.treevnc.server;
|
11
|
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 {
|
13
|
10 private int counter = 0, parentnum = 0;
|
11
|
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;
|
13
|
17 private final int treebranch = 2;
|
11
|
18 private String newparent,request,myAddress;
|
|
19 private String leaderflag = "0", sendleaderflag = "0";
|
|
20 private final int intv_time = 100;
|
|
21
|
|
22
|
|
23
|
38
|
24 public AcceptClient() {
|
11
|
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 try {
|
|
39 while (true) {
|
|
40 String line = is.readLine();
|
|
41 String port = is.readLine();
|
|
42 myAddress = getMyAddress();
|
|
43 if ("1".equals(line)||"3".equals(line)) {
|
|
44 String treeNumber = is.readLine();
|
|
45 // reply to Parents lost node
|
|
46 checkWait(os,is,port,Integer.parseInt(treeNumber));
|
|
47
|
|
48 } else if ("2".equals(line)) {
|
|
49 // reply to not Found Parents
|
|
50 replyNodeInformation(port);
|
|
51 listupdate(port, newparent);
|
|
52 outputStream(os, newparent, String.valueOf(parentnum),
|
|
53 port, leaderflag);
|
|
54 os.close();
|
|
55 is.close();
|
|
56 } else if (line!=null){
|
|
57 //connection First time
|
|
58 if(checkAddress(line)){
|
|
59 outputStream(os, myAddress,"0","0","0");
|
|
60 break;
|
|
61 }else {
|
|
62 if(replyCreateTree(os, port, line)) {
|
|
63 break;
|
|
64 } else {
|
|
65 break;
|
|
66 }
|
|
67 }
|
|
68 }
|
|
69 }
|
|
70 } catch (IOException e) {
|
|
71 System.out.println(e);
|
|
72 } catch (InterruptedException e) {
|
|
73 e.printStackTrace();
|
|
74 }
|
|
75 }
|
|
76
|
|
77 private boolean checkAddress(String line){
|
|
78 String test[] = line.split("\\.");
|
|
79 int a = Integer.parseInt(test[0]);
|
|
80 int b = Integer.parseInt(test[1]);
|
|
81 if((192==a&&b==168)||(172==a&&(b>15||b<32))||10==a) {
|
|
82 return true;
|
|
83 } else{
|
|
84 return false;
|
|
85 }
|
|
86 }
|
|
87
|
|
88 /**
|
|
89 * @param port
|
|
90 * parent value
|
|
91 */
|
|
92 private synchronized void listupdate(String port) {
|
|
93 ls.remove(Integer.parseInt(port));
|
|
94 ls.add(Integer.parseInt(port), ls.getLast());
|
|
95 ls.removeLast();
|
|
96 }
|
|
97
|
|
98 private synchronized void listupdate(String port,String myaddr) {
|
|
99 ls.remove(Integer.parseInt(port));
|
|
100 ls.add(Integer.parseInt(port), myaddr);
|
|
101 ls.removeLast();
|
|
102 }
|
|
103
|
|
104 private void outputStream(PrintStream os, String request, String parentnum,
|
|
105 String treenum, String leaderflag) {
|
|
106 os.println(request);
|
|
107 os.println(parentnum);
|
|
108 os.println(treenum);
|
|
109 os.println(leaderflag);
|
|
110 }
|
|
111
|
|
112 private void checkParameter(int parent, int counter, String leaderflag) {
|
|
113 System.out.println("number p =" + parentnum);
|
|
114 System.out.println("number i =" + counter);
|
|
115 System.out.println("leaderflag=" + leaderflag + "\n");
|
|
116 }
|
|
117
|
|
118 private synchronized void addClientAdress(String line, LinkedList<String> ls) {
|
|
119 if (line != null) {
|
|
120 ls.add(line);
|
|
121 }
|
|
122 //displyLinkedList(ls);
|
|
123 }
|
|
124
|
|
125 private String decisionLeader(int counter, int treebranch) {
|
|
126 if ((counter - 1) % treebranch == 1) { // children in most young treenum
|
|
127 // have leaderflag 1 other 0
|
|
128 return "0";
|
|
129 } else {
|
|
130 return "1";
|
|
131 }
|
|
132 }
|
|
133
|
|
134 String getMyAddress () {
|
|
135 InetAddress addr = null;
|
|
136 try {
|
|
137 addr = InetAddress.getLocalHost();
|
|
138 } catch (UnknownHostException e) {
|
|
139 e.printStackTrace();
|
|
140 }
|
|
141 return new String(addr.getHostAddress());
|
|
142 }
|
|
143
|
|
144 private void replyNodeInformation (String port) {
|
|
145 parentnum = (Integer.parseInt(port) - 1) / treebranch;
|
|
146 newparent = ls.get(parentnum);
|
|
147 sendleaderflag = decisionLeader(Integer.parseInt(port), treebranch);
|
|
148 //leaderflag = decisionLeader(Integer.parseInt(port),treebranch);
|
|
149 }
|
|
150
|
|
151 private void replyLeaderNode(PrintStream os,BufferedReader is,String port,String treeNumber) throws IOException, InterruptedException {
|
|
152 os.println(ls.getLast());
|
|
153 replyNodeInformation(port);
|
|
154 counter--;
|
|
155 passCheck = 1;
|
|
156 reportLastNode(ls.getLast(), newparent,port, String.valueOf(parentnum),sendleaderflag);
|
|
157 listupdate(port);
|
|
158 waitThread();
|
|
159 /*
|
|
160 if (Integer.parseInt(treeNumber)==ls.size()-1)
|
|
161 return;
|
|
162 */
|
|
163 //displyLinkedList(ls);
|
|
164 os.println(port);
|
|
165 leaderflag = decisionLeader(Integer.parseInt(treeNumber),treebranch);
|
|
166 os.println(treeNumber);
|
|
167 Thread.sleep(intv_time);
|
|
168 is.close();
|
|
169 os.close();
|
|
170 }
|
|
171
|
|
172 private void replyNormalChildren(PrintStream os,BufferedReader is,String port,String treeNumber,boolean flag) throws IOException, InterruptedException {
|
|
173 if(flag)
|
|
174 notifyThread();
|
|
175 else
|
|
176 waitThread();
|
|
177 if (Integer.parseInt(treeNumber)==ls.size())
|
|
178 return;
|
|
179 os.println(ls.get(Integer.parseInt(port)));
|
|
180 os.println(port);
|
|
181 if(ls.size()-1+passCheck == Integer.parseInt(treeNumber))
|
|
182 treeNumber = "skip";
|
|
183 passCheck = 0;
|
|
184 os.println(treeNumber);
|
|
185 System.out.println("num4="+ ls.get(Integer.parseInt(port)));
|
|
186 runflag = false;
|
|
187 is.close();
|
|
188 os.close();
|
|
189 }
|
|
190
|
|
191 private synchronized boolean replyCreateTree(PrintStream os,String port,String line) throws InterruptedException {
|
|
192 if (addrRegistor == true) {
|
|
193 ls.add(myAddress);
|
|
194 addrRegistor = false;
|
|
195 }
|
|
196
|
|
197 if (line != null) {
|
|
198 addClientAdress(line, ls);
|
|
199 counter++;
|
|
200 } else {
|
|
201 return true;
|
|
202 }
|
|
203
|
|
204 if (counter >= treebranch + 1) {
|
|
205 leaderflag = decisionLeader(counter, treebranch);
|
|
206 parentnum = (counter - 1) / treebranch;
|
|
207 request = ls.get(parentnum);
|
|
208 System.out.println(parentnum);
|
|
209 outputStream(os, request,String.valueOf(parentnum),
|
|
210 String.valueOf(counter), leaderflag);
|
|
211 checkParameter(parentnum, counter, leaderflag);
|
|
212 } else {
|
|
213 outputStream(os, myAddress, "0",
|
|
214 String.valueOf(counter), leaderflag);
|
|
215 }
|
|
216 Thread.sleep(intv_time);
|
|
217 return false;
|
|
218 }
|
|
219
|
|
220 void reportLastNode(String newchild, String newparent, String newtreenum,
|
|
221 String newpnum, String newleaderflag) throws IOException {
|
|
222 try {
|
|
223 Socket echoSocket;
|
|
224 System.out.println(newchild + "connect");
|
|
225 // echoSocket = new Socket(newchild, 10001 + (i + 1));//
|
|
226 echoSocket = new Socket(newchild, 10001);
|
|
227 DataOutputStream os = new DataOutputStream(echoSocket.getOutputStream());
|
|
228 os.writeBytes(newparent + "\n");
|
|
229 os.writeBytes(newpnum + "\n");
|
|
230 os.writeBytes(newtreenum + "\n");
|
|
231 os.writeBytes(newleaderflag + "\n");
|
|
232 os.close();
|
|
233 } catch (UnknownHostException e) {
|
|
234 System.err.println("Don't know about host: localhost");
|
|
235 } catch (IOException e) {
|
|
236 System.err
|
|
237 .println("Couldn't get I/O for the connection to: localhost");
|
|
238 }
|
|
239 }
|
|
240
|
|
241 void reportFinishFlag(String nextLastNode) {
|
|
242 Socket echoSocket;
|
|
243 try {
|
|
244 echoSocket = new Socket(nextLastNode, 10001);
|
|
245 DataOutputStream os = new DataOutputStream(
|
|
246 echoSocket.getOutputStream());
|
|
247 os.writeBytes("lastnode" + "\n");
|
|
248 } catch (UnknownHostException e) {
|
|
249 e.printStackTrace();
|
|
250 } catch (IOException e) {
|
|
251 e.printStackTrace();
|
|
252 }
|
|
253
|
|
254 }
|
|
255
|
|
256 synchronized void checkWait(PrintStream os,BufferedReader is,String port,int treeNum) throws InterruptedException, IOException {
|
|
257 final int TIMEOUT = 3000;
|
|
258 if (passNumber == 0) {
|
|
259 passNumber++;
|
|
260 numberZone = ((treeNum - 1) / treebranch);
|
|
261 //System.out.println(treeNum + "--wait--");
|
|
262 replyLeaderNode(os,is,port,String.valueOf(treeNum));
|
|
263 notifyAll();
|
|
264 passNumber = 0;
|
|
265 } else if (numberZone == ((treeNum - 1) / treebranch)) {
|
|
266 if (++passNumber == treebranch) {
|
|
267 //System.out.println(treeNum + "--notify--");
|
|
268 passNumber = 0;
|
|
269 replyNormalChildren(os,is,port,String.valueOf(treeNum),true);
|
|
270 } else {
|
|
271 //System.out.println(treeNum + "--waityobi--");
|
|
272 replyNormalChildren(os,is,port,String.valueOf(treeNum),false);
|
|
273 wait(TIMEOUT);
|
|
274 }
|
|
275 } else {
|
|
276 wait();
|
|
277 checkWait(os,is,port,treeNum);
|
|
278 }
|
|
279 }
|
|
280
|
|
281 private void waitThread() {
|
|
282 final int TIMEOUT = 3000;
|
|
283 try {
|
|
284 wait(TIMEOUT);
|
|
285 } catch (InterruptedException e) {
|
|
286 e.printStackTrace();
|
|
287 }
|
|
288 }
|
|
289 private void notifyThread() {
|
|
290 notifyAll();
|
|
291 }
|
38
|
292
|
|
293 public LinkedList<String> getList() {
|
|
294 return ls;
|
|
295 }
|
|
296
|
|
297 public void setList(LinkedList<String> _ls) {
|
|
298 ls = _ls;
|
|
299 }
|
11
|
300 } |