Mercurial > hg > Members > nobuyasu > tightVNCProxy
view src/myVncProxy/acceptClient.java @ 72:e07844f7d884
update Proxy
author | one |
---|---|
date | Tue, 26 Jul 2011 22:25:13 +0900 |
parents | 3ec4c9e94462 |
children |
line wrap: on
line source
package myVncProxy; import java.net.Socket; import java.io.*; import java.net.*; import java.util.*; public class acceptClient extends Thread { int counter = 0, parentnum = 0, t = 0/* in order to count at host lost*/; LinkedList<String> ls = new LinkedList<String>(); boolean runflag = false; private String name; boolean addrRegistor = true; public acceptClient(String _name) { name = _name; } public acceptClient() { new CreateThread(this); } public synchronized void gethost(BufferedReader is, PrintStream os) { String line, port, handover; int intv_time = 100; String request; int treebranch = 2;// treeの子ノードの数 String leaderflag = "0", sendleaderflag = "0"; // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す try { while (true) { line = is.readLine(); port = is.readLine(); System.out.println("データーを受信しましたlin=" + line + " :port="+ port); // 自分の IPADRESSを取得する InetAddress addr = InetAddress.getLocalHost(); String add = new String(addr.getHostAddress()); if ("1".equals(line)) { System.out.println("親が落ちましたmessage" + port); os.println(ls.getLast()); handover = String.valueOf((Integer.parseInt(port) - 1) / treebranch); String hidenchild = ls.getLast(); String newparent = ls.get(Integer.parseInt(handover)); listupdate(port); counter--; t++; runflag = true; parentnum = (Integer.parseInt(port) - 1) / treebranch; if ((counter - 1) % treebranch == 1) { sendleaderflag = "1"; } else { sendleaderflag = "0"; } child child = new child(); child.clost(hidenchild, newparent, port, handover, sendleaderflag, counter); os.println(port); Thread.sleep(intv_time); is.close(); os.close(); } else if ("2".equals(line)) { if ((counter - 1) % treebranch == 1) { sendleaderflag = "1"; } else { sendleaderflag = "0"; } parentnum = (Integer.parseInt(port) - 1) / treebranch; outputStream(os,ls.get(parentnum),String.valueOf(parentnum), port,sendleaderflag); ls.add(Integer.parseInt(port), ls.getLast()); ls.removeLast(); } else if ("3".equals(line)) { System.out.println("落ちたのを確認しました"); os.println(ls.get(Integer.parseInt(port))); os.println(port); int g = 0; for (String bs : ls) { System.out.println(g + "番目" + bs); g++; } System.out.println("num4=" + ls.get(Integer.parseInt(port))); line = null; runflag = false; is.close(); os.close(); } else { if (addrRegistor == true) { ls.add(add); addrRegistor = false; } System.out.println(parentnum); if (line != null) { arg(line, ls); counter++; } else { break; } if (counter >= treebranch + 1) { if ((counter - 1) % treebranch == 0) { leaderflag = "1"; } else { leaderflag = "0"; } parentnum = (counter - 1) / treebranch; request = ls.get(parentnum); outputStream(os, request, String.valueOf(parentnum), String.valueOf(counter), leaderflag); checkParameter(parentnum, counter, leaderflag); } else { // treeの親ノードに接続する人に接続する人を教える outputStream(os, name, "0", String.valueOf(counter), leaderflag); } Thread.sleep(intv_time); } } } catch (IOException e) { System.out.println(e); } catch (InterruptedException e) { e.printStackTrace(); } } /** * @param port * parent value */ void listupdate(String port) { ls.remove(Integer.parseInt(port)); ls.add(Integer.parseInt(port), ls.getLast()); ls.removeLast(); } void outputStream(PrintStream os, String request, String parentnum, String treenum, String leaderflag) { os.println(request); os.println(parentnum); os.println(treenum); os.println(leaderflag); } void checkParameter(int parent, int counter, String leaderflag) { System.out.println("pの値=" + parentnum); System.out.println("iの値=" + counter); System.out.println("leaderflag=" + leaderflag + "\n"); } void arg(String line, LinkedList<String> ls) { if (line != null) { ls.add(line); } int g = 0; for (String bs : ls) { System.out.println(g + "番目" + bs); g++; } } } /* * class sock { void arg(String line,LinkedList<String> ls) { if(line != null){ * ls.add(line); } int g=0; * * for(String bs: ls){ System.out.println(g+"番目"+bs); g++; } } } */ class child { void clost(String hiddenchild, String newparent, String newtreenum, String newpnum, String newleaderflag, int i) throws IOException { try { Socket echoSocket; System.out.println(hiddenchild + "に接続します"); echoSocket = new Socket(hiddenchild, 10001 + (i + 1));// i+1は実験中に同じマシーンを使っていたのでportを変えて対応、本番時には取り除く予定。 DataOutputStream os = new DataOutputStream(echoSocket.getOutputStream()); os.writeBytes(newparent + "\n"); os.writeBytes(newpnum + "\n"); os.writeBytes(newtreenum + "\n"); os.writeBytes(newleaderflag + "\n"); } catch (UnknownHostException e) { System.err.println("Don't know about host: localhost"); } catch (IOException e) { System.err .println("Couldn't get I/O for the connection to: localhost"); } } }