view src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java @ 206:2b3eb4a9492f

MyRfbProto reorganization
author oc
date Wed, 02 Jul 2014 17:58:55 +0900
parents src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeRootFinderListener.java@2e1530139169
children 1badb2ce838f
line wrap: on
line source

package jp.ac.u_ryukyu.treevnc;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;

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

public class TreeRootFinderListener implements Runnable {
	public static final String McastAddr = "224.0.0.1";
	static final int BufSize = 1024;
	private boolean stopFlag = false;
	private ViewerInterface vps;
	private MulticastSocket soc;

	public TreeRootFinderListener(ViewerInterface vncProxyService) {
		vps = vncProxyService;
	}
	
	/**
	 * To find TreeVNC root, a client sends me a multicast, reply our address to him.
	 *  It contains a port to receive, so multiple TREEVNC clients can run on a PC. 
	 */
	private void replyToRootSearchMulticast() {
		byte[] buf = new byte[BufSize];
		try {
			InetAddress mAddr = InetAddress.getByName(McastAddr);
			soc = new MulticastSocket(ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
			DatagramPacket recvPacket = new DatagramPacket(buf, BufSize);
			soc.joinGroup(mAddr);
			while (!stopFlag) {
				soc.receive(recvPacket);
				String hostname = recvPacket.getAddress().getHostAddress();
		        byte[] reply = recvPacket.getData();
				int len = recvPacket.getLength();
				if (len != 12) {
					continue;
				}
				if ((reply[0]&0xff) != TreeCommand.FIND_ROOT.cmd) {
					continue;
				}
				int port = 0;
				port = reply[8];
				port = port * 256 + reply[9];
				port = port * 256 + reply[10];
				port = port * 256 + reply[11];
				
				TreeVncProtocol t = new TreeVncProtocol(hostname, port);
				try {
					t.findRootReply(vps.getRfb().getAcceptPort());
				} catch (IOException e) {
					e.printStackTrace();
				}
				if(stopFlag) break;
			}
		} catch (Exception e) {
			
		}
	}
	
	public int parse_code( byte[] bs,int offset,int len )
	{
	    int intval = 0;
	    for( int i = offset; i < len ; i++ ) {
	        if  (bs[i]==0 ) return intval;
	        intval = intval * 10 + ( bs[ i ] - '0' );
	    }
	    return intval;
	}
	

    public void run() {
		replyToRootSearchMulticast();
	}

	public void setStopFlag(boolean stopFlag) {
		this.stopFlag = stopFlag;
	}

	public boolean isStopFlag() {
		return stopFlag;
	}
	
	/**
	 *  getLocalHost() returns hostname's address. It may not connectable, but
	 *  it gives readable hostname. Do not use it to connect.
	 * @return
	 */
	String getMyAddress () {
		InetAddress addr = null;
		try {
			addr = InetAddress.getLocalHost();
		} catch (UnknownHostException e) {
			return "localhost";
		}
		return addr.getHostAddress();
	}
}