Mercurial > hg > Members > nobuyasu > tightVNCProxy
annotate src/myVncProxy/AcceptClient.java @ 169:4ee9cfadd8dc
update AcceptClient
author | one |
---|---|
date | Mon, 12 Sep 2011 16:36:40 +0900 |
parents | 0d9a824dd12f |
children | 57904d72fc09 |
rev | line source |
---|---|
73 | 1 package myVncProxy; |
2 | |
3 import java.net.Socket; | |
169 | 4 import java.net.UnknownHostException; |
73 | 5 import java.io.*; |
6 import java.net.*; | |
7 import java.util.*; | |
8 | |
9 public class AcceptClient extends Thread { | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
10 int counter = 0, parentnum = 0/* 落ちたときの親の番号をカウントするためのもの */; |
73 | 11 LinkedList<String> ls = new LinkedList<String>(); |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
12 boolean runflag = false; |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
13 private String name; |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
14 boolean addrRegistor = true; |
148 | 15 int passCheck = 0; |
169 | 16 int treebranch = 2;// treeの子ノードの数 |
17 String newparent,request,myAddress; | |
18 String leaderflag = "0", sendleaderflag = "0"; | |
19 int intv_time = 100; | |
20 | |
73 | 21 |
169 | 22 public AcceptClient(String name) { |
23 this.name = name; | |
73 | 24 } |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
25 |
73 | 26 public AcceptClient() { |
27 new CreateThread(this); | |
28 } | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
29 |
118 | 30 // public synchronized void transferParentAddrerss(BufferedReader |
31 // is,PrintStream os) { | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
32 public synchronized void transferParentAddrerss(BufferedReader is,PrintStream os) { |
169 | 33 // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す |
34 try { | |
35 while (true) { | |
36 String line = is.readLine(); | |
37 String port = is.readLine(); | |
38 myAddress = getMyAddress(); | |
39 if ("1".equals(line)) { | |
40 replyLeaderNode(os, is, port); | |
41 } else if ("2".equals(line)) { | |
42 replyNodeInformation(port); | |
43 listupdate(port, newparent); | |
44 outputStream(os, newparent, String.valueOf(parentnum), | |
45 port, leaderflag); | |
46 os.close(); | |
47 is.close(); | |
48 } else if ("3".equals(line)) { | |
49 replyNormalChildren(os, is, port); | |
50 line = null; | |
51 } else { | |
52 if(replyCreateTree(os, is, port, line)) { | |
53 break; | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
54 } |
118 | 55 } |
169 | 56 } |
57 } catch (IOException e) { | |
58 System.out.println(e); | |
59 } catch (InterruptedException e) { | |
60 e.printStackTrace(); | |
61 } | |
73 | 62 } |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
63 |
73 | 64 /** |
65 * @param port | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
66 * parent value |
73 | 67 */ |
68 void listupdate(String port) { | |
69 ls.remove(Integer.parseInt(port)); | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
70 ls.add(Integer.parseInt(port), ls.getLast()); |
73 | 71 ls.removeLast(); |
72 } | |
148 | 73 |
74 void listupdate(String port,String myaddr) { | |
75 ls.remove(Integer.parseInt(port)); | |
76 ls.add(Integer.parseInt(port), myaddr); | |
77 ls.removeLast(); | |
78 } | |
73 | 79 |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
80 void outputStream(PrintStream os, String request, String parentnum, |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
81 String treenum, String leaderflag) { |
73 | 82 os.println(request); |
83 os.println(parentnum); | |
74 | 84 os.println(treenum); |
73 | 85 os.println(leaderflag); |
86 } | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
87 |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
88 void checkParameter(int parent, int counter, String leaderflag) { |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
89 System.out.println("pの値=" + parentnum); |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
90 System.out.println("iの値=" + counter); |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
91 System.out.println("leaderflag=" + leaderflag + "\n"); |
73 | 92 } |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
93 |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
94 void addClientAdress(String line, LinkedList<String> ls) { |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
95 if (line != null) { |
73 | 96 ls.add(line); |
97 } | |
169 | 98 displyLinkedList(ls); |
99 } | |
100 | |
101 void displyLinkedList( LinkedList<String> ls) { | |
102 int g = 0; | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
103 for (String bs : ls) { |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
104 System.out.println(g + "番目" + bs); |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
105 g++; |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
106 } |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
107 } |
73 | 108 |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
109 String decisionLeader(int counter, int treebranch) { |
148 | 110 if(counter == 1) |
111 return "1"; | |
112 if ((counter - 1) % treebranch == 1)// children in most young treenum | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
113 return "0"; |
148 | 114 else |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
115 return "1"; |
73 | 116 } |
169 | 117 |
118 String getMyAddress () throws UnknownHostException { | |
119 InetAddress addr = InetAddress.getLocalHost(); | |
120 return new String(addr.getHostAddress()); | |
121 } | |
122 | |
123 void replyNodeInformation (String port) { | |
124 parentnum = (Integer.parseInt(port) - 1) / treebranch; | |
125 newparent = ls.get(parentnum); | |
126 sendleaderflag = decisionLeader(Integer.parseInt(port), treebranch); | |
127 leaderflag = decisionLeader(Integer.parseInt(port),treebranch); | |
128 } | |
129 | |
130 void replyLeaderNode(PrintStream os,BufferedReader is,String port) throws IOException, InterruptedException { | |
131 String checkRepetition = is.readLine(); | |
132 os.println(ls.getLast()); | |
133 replyNodeInformation(port); | |
134 counter--; | |
135 passCheck = 1; | |
136 Child report = new Child(); | |
137 report.reportLastNode(ls.getLast(), newparent,port, String.valueOf(parentnum), | |
138 sendleaderflag, counter); | |
139 listupdate(port); | |
140 displyLinkedList(ls); | |
141 os.println(port); | |
142 runflag = true; | |
143 leaderflag = decisionLeader( | |
144 Integer.parseInt(checkRepetition), | |
145 treebranch); | |
146 if (Integer.parseInt(checkRepetition) == counter + 1) { | |
147 checkRepetition = "stop"; | |
148 } else { | |
149 checkRepetition = "go"; | |
150 } | |
151 os.println(checkRepetition); | |
152 Thread.sleep(intv_time); | |
153 is.close(); | |
154 os.close(); | |
155 } | |
156 | |
157 void replyNormalChildren(PrintStream os,BufferedReader is,String port) throws IOException { | |
158 String checkRepetition = is.readLine(); | |
159 System.out.println("落ちたのを確認しました"); | |
160 | |
161 os.println(ls.get(Integer.parseInt(port))); | |
162 os.println(port); | |
163 | |
164 | |
165 if(ls.size()-1+passCheck == Integer.parseInt(checkRepetition)) { | |
166 checkRepetition = "skip"; | |
167 } | |
168 passCheck = 0; | |
169 | |
170 os.println(checkRepetition); | |
171 | |
172 System.out.println("num4=" | |
173 + ls.get(Integer.parseInt(port))); | |
174 | |
175 runflag = false; | |
176 is.close(); | |
177 os.close(); | |
178 } | |
179 | |
180 boolean replyCreateTree(PrintStream os,BufferedReader is,String port,String line) throws InterruptedException { | |
181 if (addrRegistor == true) { | |
182 ls.add(myAddress); | |
183 addrRegistor = false; | |
184 } | |
185 | |
186 if (line != null) { | |
187 addClientAdress(line, ls); | |
188 counter++; | |
189 } else { | |
190 return true; | |
191 } | |
192 | |
193 if (counter >= treebranch + 1) { | |
194 leaderflag = decisionLeader(counter, treebranch); | |
195 parentnum = (counter - 1) / treebranch; | |
196 request = ls.get(parentnum); | |
197 System.out.println(parentnum); | |
198 outputStream(os, request,String.valueOf(parentnum), | |
199 String.valueOf(counter), leaderflag); | |
200 checkParameter(parentnum, counter, leaderflag); | |
201 } else { | |
202 // treeの親ノードに接続する人に接続する人を教える | |
203 outputStream(os, myAddress, "0", | |
204 String.valueOf(counter), leaderflag); | |
205 } | |
206 Thread.sleep(intv_time); | |
207 return false; | |
208 } | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
209 |
73 | 210 } |
211 | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
212 class Child { |
73 | 213 |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
214 void reportLastNode(String hiddenchild, String newparent, |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
215 String newtreenum, String newpnum, String newleaderflag, int i) |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
216 throws IOException { |
73 | 217 try { |
218 Socket echoSocket; | |
219 System.out.println(hiddenchild + "に接続します"); | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
220 echoSocket = new Socket(hiddenchild, 10001 + (i + 1));// i+1は実験中に同じマシーンを使っていたのでportを変えて対応、本番時には取り除く予定。 |
73 | 221 |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
222 DataOutputStream os = new DataOutputStream( |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
223 echoSocket.getOutputStream()); |
73 | 224 |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
225 os.writeBytes(newparent + "\n"); |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
226 os.writeBytes(newpnum + "\n"); |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
227 os.writeBytes(newtreenum + "\n"); |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
228 os.writeBytes(newleaderflag + "\n"); |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
229 |
74 | 230 os.close(); |
73 | 231 } catch (UnknownHostException e) { |
232 System.err.println("Don't know about host: localhost"); | |
233 } catch (IOException e) { | |
115
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
234 System.err |
7d9e9dfd7eb8
modify AcceptClient.java
Yu Taninari <e085734@ie.u-ryukyu.ac.jp>
parents:
74
diff
changeset
|
235 .println("Couldn't get I/O for the connection to: localhost"); |
73 | 236 } |
237 | |
238 } | |
239 } |