view src/main/java/jp/ac/u_ryukyu/treevnc/server/GetBroadCastProxy.java @ 80:2951dd85e9fc

connect to real connection address instead of bad getLocalAddress().
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 30 Apr 2014 13:43:10 +0900
parents fc984746f958
children f93d0286c2ab
line wrap: on
line source

package jp.ac.u_ryukyu.treevnc.server;

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

//import TextBoxProxy;

public class GetBroadCastProxy implements Runnable {
	static final String McastAddr = "224.0.0.1";
	static final int Port = 8183;
	static final int BufSize = 1024;
	private ByteArrayInputStream inputStream;
	private boolean stopFlag = false;
	private VncProxyService vps;
	private BroadCastProxy bCast;
	private String address;
	private String str = "who";
	private MulticastSocket soc;

	public GetBroadCastProxy(VncProxyService _vps,String desktopName,String host){
	    String myaddress = getMyAddress();
	    // getMyAddress is not always connectable eg. in private segment.
		vps = _vps;
		bCast = new BroadCastProxy(vps.getRfb().getAcceptPort()+":"+host+":"
				+desktopName+":"+myaddress+":");
	}
	
	private synchronized void getData() {
		byte[] buf = new byte[BufSize];
		byte[] resorve = new byte[BufSize];
		try {
			InetAddress mAddr = InetAddress.getByName(McastAddr);
			soc = new MulticastSocket(Port);
			DatagramPacket recvPacket = new DatagramPacket(buf, BufSize);
			soc.joinGroup(mAddr);
			while (!stopFlag) {
				soc.receive(recvPacket);
				address = getAddress(recvPacket.getSocketAddress());
				inputStream = new ByteArrayInputStream(recvPacket.getData());
				inputStream.read(resorve);
				if(str.equals(castString(resorve))){
						replyBroadCast();
				}
				if(stopFlag) break;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void replyBroadCast() {
		Runnable sender = new Runnable() {
			public void run() {
				bCast.createSocket(address);
			}
		};
		new Thread(sender).start();
	}

	private String getAddress(SocketAddress addr) {
		String str = addr.toString();
		str = str.substring(1,str.indexOf(":"));
		return str;
	}
	
	private String castString(byte[] a) {
		String recover = new String(a);
		recover = recover.replace("������n", ""); // ??
		recover = recover.trim();
		return recover;
	}
	
	
	public void run() {
		getData();
	}

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

	public boolean isStopFlag() {
		return stopFlag;
	}
	
	String getMyAddress () {
		InetAddress addr = null;
		try {
			addr = InetAddress.getLocalHost();
		} catch (UnknownHostException e) {
			return "localhost";
		}
		return addr.getHostAddress();
	}
}