changeset 81:f93d0286c2ab

root find multicast send port number now.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 30 Apr 2014 17:11:15 +0900
parents 2951dd85e9fc
children cc72fdbb7c72
files src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java src/main/java/jp/ac/u_ryukyu/treevnc/client/GetDataClient.java src/main/java/jp/ac/u_ryukyu/treevnc/client/MyVncClient.java src/main/java/jp/ac/u_ryukyu/treevnc/server/BroadCastProxy.java src/main/java/jp/ac/u_ryukyu/treevnc/server/GetBroadCastProxy.java src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java
diffstat 6 files changed, 99 insertions(+), 76 deletions(-) [+]
line wrap: on
line diff
--- 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);
 
 	}
 
--- 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();
--- 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;
 	
--- 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();
-		}
-		// }
-	}
-}
--- 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 {
--- 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;