49
|
1 package myVncProxy;
|
|
2
|
|
3 import java.net.Socket;
|
|
4 import java.io.*;
|
|
5 import java.net.*;
|
|
6 import java.util.*;
|
|
7
|
|
8 public class acceptClient extends Thread {
|
|
9 ServerSocket echoServer=null;
|
|
10 // ソケットや入出力用のストリームの宣言
|
|
11 String line,port,handover;
|
|
12 BufferedReader is;
|
|
13 PrintStream os;
|
|
14 Socket clientSocket = null;
|
|
15 int intv_time = 100;
|
|
16 int i = 0 , p = 0,t = 0;
|
|
17 //String[] sub = new String[100];
|
|
18 LinkedList<String> ls = new LinkedList<String>();
|
|
19 String request,name;
|
|
20 int treebranch = 2;//treeの子ノードの数
|
|
21 String leaderflag="0",sendleaderflag="0";
|
|
22 boolean runflag =false,addrRegistor=true;
|
|
23 BufferedReader temp = null;//一時的にisを保存する変数
|
|
24
|
|
25
|
|
26 public acceptClient(String _name) {
|
|
27 // TODO Auto-generated constructor stub
|
|
28 name = _name;
|
|
29 }
|
|
30
|
|
31
|
|
32 public void run() {
|
|
33
|
|
34 while(true){
|
|
35 // ポート9999番を開く
|
|
36 try {
|
|
37 echoServer = new ServerSocket(9999);
|
|
38 }
|
|
39 catch (IOException e) {
|
|
40 System.out.println(e);
|
|
41 }
|
|
42
|
|
43 // クライアントからの要求を受けるソケットを開く
|
|
44 try {
|
|
45 clientSocket = echoServer.accept();
|
|
46 is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
|
|
47 os = new PrintStream(clientSocket.getOutputStream());
|
|
48
|
|
49 // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す
|
|
50 while (true){
|
|
51 /*
|
|
52 if(runflag==false){
|
|
53 temp = is;
|
|
54 line = is.readLine();
|
|
55 port = is.readLine();
|
|
56 }else{
|
|
57 if(temp!=null){
|
|
58 is = temp;
|
|
59 }
|
|
60 */
|
|
61 line = is.readLine();
|
|
62 port = is.readLine();
|
|
63 //}
|
|
64 System.out.println("データーを受信しましたlin="+line+" port="+port);
|
|
65 //自分の IPADRESSを取得する
|
|
66 InetAddress addr = InetAddress.getLocalHost();
|
|
67 String add = new String(addr.getHostAddress());
|
|
68
|
|
69 if("1".equals(line)){
|
|
70 System.out.println("親が落ちましたmessage" + port);
|
|
71 os.println(ls.getLast());
|
|
72 handover= String.valueOf((Integer.parseInt(port) - 1) / treebranch);
|
|
73 String hidenchild=ls.getLast();
|
|
74 String newparent=ls.get(Integer.parseInt(handover));
|
|
75 ls.remove(Integer.parseInt(port));
|
|
76 ls.add(Integer.parseInt(port),ls.getLast());
|
|
77 ls.remove(Integer.parseInt(port));
|
|
78 i--;
|
|
79 t++;
|
|
80 runflag = true;
|
|
81 if(t % treebranch == 0){
|
|
82 p--;
|
|
83 }
|
|
84 if((i-1)%treebranch==1){
|
|
85 sendleaderflag = "1";
|
|
86 }else{
|
|
87 sendleaderflag = "0";
|
|
88 }
|
|
89 /*
|
|
90 if(temp!=null){
|
|
91 System.out.println("leaderに返信します");
|
|
92 is =temp;
|
|
93 line = is.readLine();
|
|
94 port = is.readLine();
|
|
95 os.println(ls.get(Integer.parseInt(port)));
|
|
96 os.println(port);
|
|
97 runflag=false;
|
|
98 temp=null;
|
|
99 }
|
|
100 */
|
|
101
|
|
102 child child = new child();
|
|
103 child.clost(hidenchild,newparent,os,port,handover,sendleaderflag,i);
|
|
104 os.println(port);
|
|
105 Thread.sleep(intv_time);
|
|
106 is.close();
|
|
107 os.close();
|
|
108
|
|
109 }else if("2".equals(line)){
|
|
110 System.out.println("子供が落ちましたmessage" + port);
|
|
111 //exit シグナルを送る
|
|
112 Thread.sleep(intv_time);
|
|
113 }else if("3".equals(line)){
|
|
114 System.out.println("落ちたのを確認しました");
|
|
115
|
|
116 os.println(ls.get(Integer.parseInt(port)));
|
|
117 os.println(port);
|
|
118 line=null;
|
|
119 runflag = false;
|
|
120 is.close();
|
|
121 os.close();
|
|
122 }else{
|
|
123 if(addrRegistor==true){
|
|
124 ls.add(add);
|
|
125 addrRegistor = false;
|
|
126 }
|
|
127 System.out.println(p);
|
|
128 if(line != null){
|
|
129 sock conf = new sock();
|
|
130 conf.arg(line,ls);
|
|
131 i++;
|
|
132 }else{
|
|
133 break;
|
|
134 }
|
|
135
|
|
136 if(i>=treebranch+1){
|
|
137 if((i-1)%treebranch==0){
|
|
138 leaderflag = "1";
|
|
139 }else{
|
|
140 leaderflag = "0";
|
|
141 }
|
|
142 if((i-1)%treebranch==0){
|
|
143 p++;
|
|
144 }
|
|
145 // request = [p-1];
|
|
146 request = ls.get(p);
|
|
147 os.println(request);
|
|
148 System.out.println("pの値="+p);
|
|
149 os.println(String.valueOf(p));
|
|
150 System.out.println("iの値="+i);
|
|
151 os.println(String.valueOf(i));
|
|
152 System.out.println("leaderflag="+leaderflag + "\n");
|
|
153 os.println(leaderflag);
|
|
154 }else{
|
|
155 //treeの親ノードに接続する人に接続する人を教える
|
|
156
|
|
157 os.println(add);//あとで渡されたmainArgs[1](現在はname)を渡す予定
|
|
158 os.println("0");
|
|
159 os.println(String.valueOf(i));
|
|
160 os.println(leaderflag + "\n");
|
|
161 }
|
|
162 Thread.sleep(intv_time);
|
|
163 }
|
|
164 }
|
|
165 }catch (IOException e){
|
|
166 System.out.println(e);
|
|
167 }
|
|
168 catch(InterruptedException e){
|
|
169 e.printStackTrace();
|
|
170 }
|
|
171 try{
|
|
172 echoServer.close();
|
|
173 }
|
|
174 catch (IOException e){
|
|
175 System.out.println(e);
|
|
176 }
|
|
177 }
|
|
178 }
|
|
179 }
|
|
180
|
|
181
|
|
182 class sock{
|
|
183 void arg(String line,LinkedList<String> ls){
|
|
184 if(line != null){
|
|
185 ls.add(line);
|
|
186 }
|
|
187 int g=0;
|
|
188
|
|
189 for(String bs: ls){
|
|
190 System.out.println(g+"番目"+bs);
|
|
191 g++;
|
|
192 }
|
|
193 }
|
|
194 }
|
|
195
|
|
196 class child{
|
|
197 Socket echoSocket;
|
|
198 DataOutputStream os = null;
|
|
199 BufferedReader is = null;
|
|
200 void clost(String hiddenchild,String newparent,PrintStream rep,String newtreenum,String newpnum,String newleaderflag,int i) throws IOException{
|
|
201 try {
|
|
202
|
|
203 System.out.println(hiddenchild + "に接続します");
|
|
204 echoSocket = new Socket(hiddenchild, 10001 + (i + 1));//i+1は実験中に同じマシーンを使っていたのでportを変えて対応、本番時には取り除く予定。
|
|
205
|
|
206 os = new DataOutputStream(echoSocket.getOutputStream());
|
|
207 is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
|
|
208
|
|
209 os.writeBytes(newparent+"\n");
|
|
210 os.writeBytes(newpnum+"\n");
|
|
211 os.writeBytes(newtreenum+"\n");
|
|
212 os.writeBytes(newleaderflag+"\n");
|
|
213
|
|
214 /*
|
|
215 rep.println(newparent);
|
|
216 rep.println(newpnum);
|
|
217 rep.println(newtreenum);
|
|
218 rep.println(newleaderflag+"\n");
|
|
219
|
|
220 rep.close();
|
|
221 */
|
|
222 } catch (UnknownHostException e) {
|
|
223 System.err.println("Don't know about host: localhost");
|
|
224 } catch (IOException e) {
|
|
225 System.err.println("Couldn't get I/O for the connection to: localhost");
|
|
226 }
|
|
227
|
|
228 }
|
|
229 } |