view src/myVncProxy/AcceptThread.java @ 70:c92ec7258953

change name AcceptThread
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Thu, 28 Jul 2011 13:25:03 +0900
parents
children bf5ac06df675
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/*落ちたときの親の番号をカウントするためのもの*/;
	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";//Socket send standardization String
		
		
				// クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す
		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);
						/*
						ls.remove(Integer.parseInt(port));
						ls.add(Integer.parseInt(port),ls.getLast());
						ls.remove(Integer.parseInt(port));
						*/
						counter--;
						t++;
						runflag = true;
						/*
						if(t % treebranch == 0){
							parentnum--;
						}
						*/
						parentnum = (Integer.parseInt(port) -1) / treebranch;
						
						if((counter-1)%treebranch==1){ // children in most young treenum have leaderflag 1 other 0 
							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)){
						System.out.println("子供が落ちましたmessage" + port);
						//exit シグナルを送る
						Thread.sleep(intv_time);
					}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";
							}
							/*
							if((counter-1)%treebranch==0){
								parentnum++;
							}
							*/
							parentnum = (counter - 1) / treebranch;
							//			request = [p-1];
							request = ls.get(parentnum);
							/*
							os.println(request);
							os.println(String.valueOf(parentnum));
							os.println(String.valueOf(counter));
							os.println(leaderflag);
							*/
							outputStream(os,request,String.valueOf(parentnum),String.valueOf(counter),leaderflag);
							checkParameter(parentnum,counter,leaderflag);
						}else{
							//treeの親ノードに接続する人に接続する人を教える
							outputStream(os,name,"0",String.valueOf(counter),leaderflag);
							/*
							os.println(name);//あとで渡されたmainArgs[1](現在はname)を渡す予定,addに変更
							os.println("0");
							os.println(String.valueOf(counter));
							os.println(leaderflag);
							*/
						}
						Thread.sleep(intv_time);
					}
				}
				
			} catch (IOException e){
				System.out.println(e);
			}
			
			catch(InterruptedException e){
				e.printStackTrace();			
			}
			/*
			try{
				echoServer.close();
			}
			catch (IOException e){
				System.out.println(e);
			}
			*/
		//} comment out while
	}
	
	/**
	 * @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 counter,String leaderflag) {
		os.println(request);
		os.println(parentnum);
		os.println(counter);
		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{
	Socket echoSocket;
	DataOutputStream os = null;
	BufferedReader is = null;
	void clost(String hiddenchild,String newparent,String newtreenum,String newpnum,String newleaderflag,int i) throws IOException{
		try {

			System.out.println(hiddenchild + "に接続します");
			echoSocket = new Socket(hiddenchild, 10001 + (i + 1));//i+1は実験中に同じマシーンを使っていたのでportを変えて対応、本番時には取り除く予定。	

			os = new DataOutputStream(echoSocket.getOutputStream());
			is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));

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

	}
}