Mercurial > hg > Members > riono > TreeVNC_ja_comment
view src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeRootFinderListener.java @ 155:1c95bd5bebcf
root finder for multiple network.
author | oc |
---|---|
date | Fri, 13 Jun 2014 18:51:14 +0900 |
parents | 128cce60c43c |
children | 1c9f6acdfeb2 |
line wrap: on
line source
package jp.ac.u_ryukyu.treevnc.server; import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.UnknownHostException; import jp.ac.u_ryukyu.treevnc.client.TreeVncProtocol; import com.glavsoft.rfb.protocol.ProtocolContext; 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 VncProxyService vps; private MulticastSocket soc; public TreeRootFinderListener(VncProxyService _vps) { vps = _vps; } /** * 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) != ProtocolContext.FIND_ROOT) { 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(); } }