view src/myVncProxy/AcceptClient.java @ 129:0571d955da35

print connection speed.
author e085711
date Thu, 04 Aug 2011 15:11:30 +0900
parents 4423c9c5ab5b
children 7d9e9dfd7eb8
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/*落ちたときの親の番号をカウントするためのもの*/;
	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;
		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());
						parentnum = (Integer.parseInt(port) -1) / treebranch;
						String hidenchild=ls.getLast();
						String newparent=ls.get(parentnum);
						listupdate(port);
						counter--;
						runflag = true;
	
						if((counter-1)%treebranch==1) { // children in most young treenum have leaderflag 1 other 0 
							sendleaderflag = "1";
						} else {
							sendleaderflag = "0";
						}

						Child report = new Child();
						
						report.reportLastNode(hidenchild,newparent,port,String.valueOf(parentnum),
								sendleaderflag,counter);
						
						os.println(port);	
						Thread.sleep(intv_time);
						is.close();
						os.close();

					} else if("2".equals(line)) {
						parentnum = (Integer.parseInt(port) -1) / treebranch;
						String newparent=ls.get(parentnum);
						
						outputStream(os,newparent,String.valueOf(parentnum),
								String.valueOf(counter),leaderflag);
						
						os.close();
						is.close();
					} 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 = [p-1];
							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();			
			}
			/*
			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 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 reportLastNode(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");
			
			os.close();
		} 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");
		}

	}
}