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

add acceptClient.java
author e085711
date Wed, 06 Jul 2011 11:56:40 +0900
parents
children 4864a7d1df00 925d8b3eecd5
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 {
    ServerSocket echoServer=null;
    // ソケットや入出力用のストリームの宣言
    String line,port,handover;
    BufferedReader is;
    PrintStream os;
    Socket clientSocket = null;
    int intv_time = 100;
    int i = 0 , p = 0,t = 0;
    //String[] sub = new String[100];
    LinkedList<String> ls = new LinkedList<String>();
    String request,name;
    int treebranch = 2;//treeの子ノードの数
    String leaderflag="0",sendleaderflag="0";
    boolean runflag =false,addrRegistor=true;
    BufferedReader temp = null;//一時的にisを保存する変数
    

    public acceptClient(String _name) {
		// TODO Auto-generated constructor stub
    		name = _name;
	}


	public void run() {

	while(true){
	    // ポート9999番を開く
	    try {
	    	echoServer = new ServerSocket(9999);
	    }
	    catch (IOException e) {
	    	System.out.println(e);
	    }
	    
	    // クライアントからの要求を受けるソケットを開く 
	    try {
	    	clientSocket = echoServer.accept();
	    	is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
	    	os = new PrintStream(clientSocket.getOutputStream());

		// クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す
		while (true){
			/*
			if(runflag==false){
				temp = is;
				line = is.readLine();
				port = is.readLine();
			}else{
				if(temp!=null){
				 is = temp;
				}
				*/
				 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));
		    	ls.remove(Integer.parseInt(port));
			    ls.add(Integer.parseInt(port),ls.getLast());
			    ls.remove(Integer.parseInt(port));
			    i--;
			    t++;
			    runflag = true;
			    if(t % treebranch == 0){
			    	p--;
			    }
		    	if((i-1)%treebranch==1){
					sendleaderflag = "1";
				}else{
					sendleaderflag = "0";
				}
		    	/*
		    		if(temp!=null){
		    			System.out.println("leaderに返信します");
		    			is =temp;
		    			line = is.readLine();
						port = is.readLine();
		    			os.println(ls.get(Integer.parseInt(port)));
		    			os.println(port);
		    			runflag=false;
		    			temp=null;
		    		}
		    		*/
		    	
			    	child child = new child();
			    	child.clost(hidenchild,newparent,os,port,handover,sendleaderflag,i);
			    	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);
		    			line=null;
		    			runflag = false;
		    			is.close();
		    			os.close();
		    }else{
		    	if(addrRegistor==true){
		    		ls.add(add);
		    		addrRegistor = false;
		    	}
		    	System.out.println(p);
		    	if(line != null){
		    		sock conf = new sock();
		    		conf.arg(line,ls);
		    		i++;
		    	}else{
		    		break;
		    	}

		    if(i>=treebranch+1){
		    		if((i-1)%treebranch==0){
		    			leaderflag = "1";
		    		}else{
		    			leaderflag = "0";
		    		}
		    		if((i-1)%treebranch==0){
		    			p++;
		    		}
			//			request = [p-1];
			request = ls.get(p);
			os.println(request);
			System.out.println("pの値="+p);
			os.println(String.valueOf(p));
			System.out.println("iの値="+i);
			os.println(String.valueOf(i));
			System.out.println("leaderflag="+leaderflag + "\n");
			os.println(leaderflag);
		    }else{
		    	//treeの親ノードに接続する人に接続する人を教える

			os.println(add);//あとで渡されたmainArgs[1](現在はname)を渡す予定
			os.println("0");
			os.println(String.valueOf(i));
			os.println(leaderflag + "\n");
		    }
		    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);
	    }
	}
    }
}


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,PrintStream rep,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");
    	    
    	  /*  
    	    rep.println(newparent);
    		rep.println(newpnum);
    		rep.println(newtreenum);
    		rep.println(newleaderflag+"\n");

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