view src/main/java/jp/ac/u_ryukyu/treevnc/client/GetHostClient.java @ 125:32c6563492f3

add vnc protocol command sender.
author oc
date Thu, 05 Jun 2014 18:30:45 +0900
parents 233e94a7b5ed
children 775ce6a14f89
line wrap: on
line source

package jp.ac.u_ryukyu.treevnc.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.BindException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import com.glavsoft.rfb.protocol.ProtocolContext;
import com.glavsoft.viewer.swing.ConnectionParams;

import jp.ac.u_ryukyu.treevnc.server.GetBroadCastProxy;

public class GetHostClient implements Runnable {
	final int BUFSIZE = 1024;
	private byte[] buf = new byte[BUFSIZE];
	private InetAddress mAddr;
	private MulticastSocket soc;
	private String str;

    private ServerSocket server = null;
    private BufferedReader is;
    private int port = ConnectionParams.DEFAULT_VNC_ROOT_FINDER;
    private boolean stopFlag;
    private TextBoxClient text = new TextBoxClient();
    private String proxyAddr;

    /**
     * To find vnc root, a client sends a multicast packet. 
     * @param _str
     */
	public GetHostClient(String _str) {
		str = _str;
	}

	public void createSocket() {
        do {
            try {
                server = new ServerSocket(port);
            } catch (BindException e){
                port ++;
            } catch (IOException e) {
                // can't open socket
            }
        } while (server == null);
		
		try {
			mAddr = InetAddress.getByName(GetBroadCastProxy.McastAddr);
			soc = new MulticastSocket();
			soc.setTimeToLive(1);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * send find root message.
	 * 
	 */
	public void sendData() {
	    String s = str + Integer.toString(port);
		buf = s.getBytes();
		DatagramPacket sendPacket = new DatagramPacket(buf, s.length(), mAddr, ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
		try {
				soc.send(sendPacket);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void getHost() {
		createSocket();
		sendData();
	}

	public void findRoot() {
		ByteBuffer buf = ByteBuffer.allocate(12);
		buf.order(ByteOrder.BIG_ENDIAN);
		buf.put((byte) ProtocolContext.FIND_ROOT);
		buf.put((byte) 0);
		buf.put((byte) 0);
		buf.put((byte) 0);
		buf.putInt(4); // length
		buf.putInt(port);
		buf.flip();

		DatagramPacket sendPacket = new DatagramPacket(buf.array(), buf.limit(), mAddr, ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
		try {
			soc.send(sendPacket);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

    
    /**
     * @return
     * reply to findRootMassage
     * 
     */
    public String textAddress() {
        return text.getAddress();
    }
    
    public String  textPort() {
        return text.getPort();
    }
    
    void socketClose() {
        try {
            text.unVisible();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * TREEVNC_ROOT_FINDER is sent, wait for reply
     */
    @Override
    public void run() {
        try {
            while(!stopFlag) {
                Socket socket = server.accept();  
                is = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                proxyAddr = is.readLine();
                // proxyAddr format
                // 5999:localhost:localhost:133.13.59.210:
                // port:hostnae:hostname:ip address:
                // GetBroadCastProxy create this string on VNC root
                InetAddress adr = socket.getInetAddress();
                String proxyAddr1 = adr.getHostName();
                if (proxyAddr1 != null) {
                    int portIndex = proxyAddr.indexOf(":");
                    int restIndex = proxyAddr.indexOf(":", portIndex+1);
                    if (portIndex>0) {
                        proxyAddr = proxyAddr.substring(0, portIndex)+":"+proxyAddr1 + ":" + proxyAddr.substring(restIndex+1);
                    }
                }
                if(proxyAddr!=null)
                    text.checkBox(proxyAddr);
                text.setButton();
                text.visible();
            }
            System.err.println("stop");
        } catch (IOException e) {
        }
    }

    public void setStopFlag(boolean stopFlag) {
        this.stopFlag = stopFlag;
        
    }
   
    /**
     * the thread is waiting accept system call,
     * close the socket causes exception,
     * which will terminated the thread.
     * 
     */
    public void interrupt() {
    	stopFlag = true;
		try {
			server.close();
	    	soc.close();
		} catch (IOException e) {
		}
        Thread.currentThread().interrupt();
    }

    public boolean isStopFlag() {
        return stopFlag;
    }
    
    public void ipRegister() {
        text.ipRegister();
    }

    public String getProxyAddr() {
        return proxyAddr;
    }
}