# HG changeset patch # User Shinji KONO # Date 1398845475 -32400 # Node ID f93d0286c2abd54ba99318a3ca39d57c3a2ac15d # Parent 2951dd85e9fc4603ed33e09295909e27b95ef263 root find multicast send port number now. diff -r 2951dd85e9fc -r f93d0286c2ab src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java Wed Apr 30 13:43:10 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java Wed Apr 30 17:11:15 2014 +0900 @@ -1,29 +1,43 @@ package jp.ac.u_ryukyu.treevnc; +import java.util.logging.Logger; + import com.glavsoft.viewer.ViewerImpl; + import jp.ac.u_ryukyu.treevnc.client.EchoClient; import jp.ac.u_ryukyu.treevnc.client.GetDataClient; import jp.ac.u_ryukyu.treevnc.client.GetHostClient; +import jp.ac.u_ryukyu.treevnc.server.GetBroadCastProxy; + + public class CreateConnectionParam { private String hostName; private int portNumber; private MyRfbProto rfb; - + private final Logger logger; + public CreateConnectionParam(MyRfbProto rfb) { this.rfb = rfb; + logger = Logger.getLogger(getClass().getName()); } public void communicationToProxy() { - GetHostClient bCast = new GetHostClient("who"); + GetHostClient bCast = new GetHostClient(GetBroadCastProxy.MULTICAST_FIND_TREEVNC_ROOT); bCast.getHost(); GetDataClient getBcast = new GetDataClient(); - // we should try this in a loop until get correct hostName - Thread runBcast = new Thread(getBcast); - runBcast.start(); - hostName = getBcast.textAddress(); - portNumber = Integer.parseInt(getBcast.textPort()); - getBcast.interrupt(); + portNumber = 0; + do { + try { + Thread runBcast = new Thread(getBcast); + runBcast.start(); + hostName = getBcast.textAddress(); + portNumber = Integer.parseInt(getBcast.textPort()); + } catch (Exception e) { + logger.info("can't get parent address or port"); + } + getBcast.interrupt(); + } while ( portNumber == 0); } diff -r 2951dd85e9fc -r f93d0286c2ab src/main/java/jp/ac/u_ryukyu/treevnc/client/GetDataClient.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/GetDataClient.java Wed Apr 30 13:43:10 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/GetDataClient.java Wed Apr 30 17:11:15 2014 +0900 @@ -3,6 +3,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.net.BindException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; @@ -35,10 +36,16 @@ @Override public void run() { - try { - server = new ServerSocket(port); - while(!stopFlag) { - Socket socket = server.accept(); + try { + do { + try { + server = new ServerSocket(port); + } catch (BindException e){ + port ++; + } + } while (server == null); + while(!stopFlag) { + Socket socket = server.accept(); is = new BufferedReader(new InputStreamReader( socket.getInputStream())); proxyAddr = is.readLine(); diff -r 2951dd85e9fc -r f93d0286c2ab src/main/java/jp/ac/u_ryukyu/treevnc/client/MyVncClient.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/MyVncClient.java Wed Apr 30 13:43:10 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/MyVncClient.java Wed Apr 30 17:11:15 2014 +0900 @@ -20,7 +20,6 @@ * */ private static final long serialVersionUID = 1L; - public static final int DEFAULT_PORT = 5900; public static Logger logger = Logger.getLogger("com.glavsoft"); private final ProtocolSettings settings; diff -r 2951dd85e9fc -r f93d0286c2ab src/main/java/jp/ac/u_ryukyu/treevnc/server/BroadCastProxy.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/BroadCastProxy.java Wed Apr 30 13:43:10 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -package jp.ac.u_ryukyu.treevnc.server; - -import java.io.IOException; -import java.io.PrintStream; -import java.net.Socket; - -public class BroadCastProxy { - private String str; - private Socket socket = null; - private PrintStream os = null; - private int port = 8182; - - public BroadCastProxy(String _str) { - str = _str; - } - - void createSocket(String addr) { - // while (true) { - try { - Thread.sleep(1000); - socket = new Socket(addr, port); - os = new PrintStream(socket.getOutputStream()); - os.println(str); - System.out.println(str); - os.close(); - socket.close(); - //break; - } catch (IOException e) { - System.out.println("Connection faild"); - //continue; - } catch (InterruptedException e) { - e.printStackTrace(); - } - // } - } -} diff -r 2951dd85e9fc -r f93d0286c2ab src/main/java/jp/ac/u_ryukyu/treevnc/server/GetBroadCastProxy.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/GetBroadCastProxy.java Wed Apr 30 13:43:10 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/GetBroadCastProxy.java Wed Apr 30 17:11:15 2014 +0900 @@ -2,37 +2,41 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.PrintStream; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; +import java.net.Socket; 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; + public static final String McastAddr = "224.0.0.1"; 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"; + public static String MULTICAST_FIND_TREEVNC_ROOT = "TREEVNC-who:"; private MulticastSocket soc; + private String bCast; 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+":"); + bCast = vps.getRfb().getAcceptPort()+":"+host+":" + +desktopName+":"+myaddress+":"; } - private synchronized void getData() { + /** + * 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]; - byte[] resorve = new byte[BufSize]; + byte[] reply = new byte[BufSize]; try { InetAddress mAddr = InetAddress.getByName(McastAddr); soc = new MulticastSocket(Port); @@ -40,23 +44,61 @@ soc.joinGroup(mAddr); while (!stopFlag) { soc.receive(recvPacket); - address = getAddress(recvPacket.getSocketAddress()); + String address = getAddress(recvPacket.getSocketAddress()); inputStream = new ByteArrayInputStream(recvPacket.getData()); - inputStream.read(resorve); - if(str.equals(castString(resorve))){ - replyBroadCast(); + inputStream.read(reply); + int i = 0; + for(byte b : MULTICAST_FIND_TREEVNC_ROOT.getBytes()) { + if (b != reply[i]) return; + i++; } + int port = parse_code(reply,i); + replyToClient(address,port,bCast); if(stopFlag) break; } - } catch (IOException e) { - e.printStackTrace(); + } catch (Exception e) { + } } - private void replyBroadCast() { + public int parse_code( byte[] bs,int offset ) + { + int intval = 0; + for( int i = offset; i < bs.length ; i++ ) + intval = intval * 10 + ( bs[ i ] - '0' ); + return intval; + } + + + /** + * To find me (TreeVNC root) ,a client send a broadcast with port number. + * Send the parameter to connect to him. + * The client's GetDataClient will receive this message. + * + * @param addr + * @param port + * @param str + */ + private void replyToClient(String addr, int port_,String str_) { + final String address = addr; + final int port = port_; + final String str = str_; Runnable sender = new Runnable() { public void run() { - bCast.createSocket(address); + + try { + Thread.sleep(1000); + Socket socket = new Socket(address, port); // This is a TCP stream to reply + PrintStream os = new PrintStream(socket.getOutputStream()); + os.println(str); + os.print(Integer.toString(port)); + os.close(); + socket.close(); + } catch (IOException e) { + System.out.println("Connection faild"); + } catch (InterruptedException e) { + System.out.println("Connection faild"); + } } }; new Thread(sender).start(); @@ -68,16 +110,8 @@ 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(); + replyToRootSearchMulticast(); } public void setStopFlag(boolean stopFlag) { @@ -88,6 +122,11 @@ 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 { diff -r 2951dd85e9fc -r f93d0286c2ab src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java --- a/src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java Wed Apr 30 13:43:10 2014 +0900 +++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java Wed Apr 30 17:11:15 2014 +0900 @@ -32,7 +32,7 @@ */ public class ConnectionParams implements Model { public static final int DEFAULT_SSH_PORT = 22; - private static final int DEFAULT_RFB_PORT = 5900; + public static final int DEFAULT_RFB_PORT = 5900; public String hostName; private int portNumber;