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