comparison src/myVncProxy/acceptClient.java @ 49:5953ac30cb20

add acceptClient.java
author e085711
date Wed, 06 Jul 2011 11:56:40 +0900
parents
children 4864a7d1df00 925d8b3eecd5
comparison
equal deleted inserted replaced
48:1ad24c0af09e 49:5953ac30cb20
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 }