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