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");
		}

	}
}