changeset 147:703db66138b5

WhereToConnect
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 13 Jun 2014 07:12:52 +0900
parents 5be1d92e7835
children 8d01028906c4
files src/main/java/jp/ac/u_ryukyu/treevnc/MyRfbProto.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncCommand.java src/main/java/jp/ac/u_ryukyu/treevnc/client/TreeVncProtocol.java src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeVNCNode.java src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java
diffstat 6 files changed, 36 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/MyRfbProto.java	Fri Jun 13 01:19:08 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/MyRfbProto.java	Fri Jun 13 07:12:52 2014 +0900
@@ -12,12 +12,9 @@
 import java.util.zip.DataFormatException;
 import java.util.zip.Deflater;
 import java.util.zip.Inflater;
-
-import sun.rmi.runtime.Log;
 import jp.ac.u_ryukyu.treevnc.client.TreeVncProtocol;
 import jp.ac.u_ryukyu.treevnc.server.RequestScreenThread;
 import jp.ac.u_ryukyu.treevnc.server.VncProxyService;
-
 import com.glavsoft.exceptions.TransportException;
 import com.glavsoft.rfb.client.ClientToServerMessage;
 import com.glavsoft.rfb.encoding.EncodingType;
@@ -105,7 +102,7 @@
             }
         } catch (Exception e) {
             try {
-                System.out.println("new client faild");
+                System.out.println("new client faild :" + e.getMessage());
                 newCli.close();
                 return;
             } catch (IOException e1) {
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncCommand.java	Fri Jun 13 01:19:08 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncCommand.java	Fri Jun 13 07:12:52 2014 +0900
@@ -26,12 +26,18 @@
 
     /**
      * handle TreeVNC Command
-     * @param b   12byte header ( command 4byte, length 4byte, port 4byte, option String )
+     * @param b   byte [] command
      * @param is
      * @param os
      * @param myHostName 
      * @throws TransportException 
      * @throws IOException 
+     * 
+     * TreeVNC Command is sent as a possible replied version message. 12 bytes is already read.
+     *       Command 4 byte (including padding)
+     *       lenght      4 byte 
+     *       port         4 byte 
+     *       rest of data ( add padding if it is shorter than 12 byte)
      */
     void treeVncCommand(byte[] b, Reader is, Writer os, String myHostName) throws TransportException, IOException {
     	ByteBuffer buf = ByteBuffer.wrap(b);
@@ -41,6 +47,10 @@
         int port = buf.getInt();
         String hostname = null;
         if (length>4) {
+            if (length>1024) {
+                System.out.println("Too long TreeVncCommand ");
+                return;
+            }
              byte namebuf[] = new byte[length-4];
              try {
                 is.readBytes(namebuf);
@@ -60,10 +70,10 @@
             handleConnectTo( port,hostname,false);
             break;
     	case ProtocolContext.FIND_ROOT :
-    	    // this is a multicast message, cannot happen
+    	    // this is a multicast message, it is handled in FindRootListener
     	    break;
         case ProtocolContext.WHERE_TO_CONNECT : 
-            handleWhereToConnect(port,hostname);
+            handleWhereToConnect(port,hostname, myHostName);
             break;
         case ProtocolContext.LOST_PARENT :
             handleLostParent(port,hostname);
@@ -79,9 +89,10 @@
      * tell him his parent
      * @param port
      * @param hostname
+     * @param myHostName 
      */
-    void handleWhereToConnect(int port, String hostname) {
-        viewer.replyCreateTree(hostname,port);
+    void handleWhereToConnect(int port, String hostname, String myHostName) {
+        viewer.replyCreateTree(hostname,port,myHostName);
     }
 
     /**
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/TreeVncProtocol.java	Fri Jun 13 01:19:08 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/TreeVncProtocol.java	Fri Jun 13 07:12:52 2014 +0900
@@ -63,7 +63,9 @@
 	public void sendWithHostAndPort(int command, String hostname, int port)
 			throws IOException {
 		openport();
-		ByteBuffer buf = ByteBuffer.allocate(4+4+4+hostname.length());
+		int cmdlen = 4+4+4+hostname.length();
+		if (cmdlen < 12) cmdlen=12;
+		ByteBuffer buf = ByteBuffer.allocate(cmdlen);
 		buf.order(ByteOrder.BIG_ENDIAN);
 		buf.put((byte) command);
 		
@@ -73,12 +75,12 @@
 		buf.putInt(4+hostname.length()); // length
 		buf.putInt(port);
 		buf.put(hostname.getBytes(), 0, hostname.length());
+		while (buf.hasRemaining() ) buf.put((byte)0) ;
+        buf.flip();
 		sendCommandToTheRoot(buf);
 	}
 
     public void sendCommandToTheRoot(ByteBuffer buf) throws IOException {
-        buf.flip();
-
         char[] charBuf = new char[12];
         is.read(charBuf , 0, 12);                       // skip root's version header
         os.write(buf.array(), 0, buf.limit());         // send our command
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java	Fri Jun 13 01:19:08 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java	Fri Jun 13 07:12:52 2014 +0900
@@ -5,6 +5,7 @@
 import java.net.*;
 import java.util.*;
 
+import jp.ac.u_ryukyu.treevnc.MyRfbProto;
 import jp.ac.u_ryukyu.treevnc.client.TreeVncProtocol;
 
 public class AcceptClient {
@@ -12,11 +13,13 @@
 	boolean runflag = false;
 	private final int treebranch = 2;
 	//  private final int intv_time = 100;    avoid too frequent reconnection
+    private MyRfbProto rfb;
 
-	public AcceptClient(String hostName, int vncport) {
-		TreeVNCNode me = new TreeVNCNode(hostName, vncport);
+	public AcceptClient(String hostName, int vncport, MyRfbProto myRfb) {
+		TreeVNCNode me = new TreeVNCNode(hostName, vncport,"localhost");
 		me.setTreeNum(0);
 		nodeList.add(me);
+		rfb = myRfb;
 	}
 	
 //
@@ -118,8 +121,8 @@
 	 * @param hostname
 	 * @param port
 	 */
-	public void replyCreateTree(String hostname, int port) {
-        TreeVNCNode node = new TreeVNCNode(hostname,port);
+	public void replyCreateTree(String hostname, int port, String localhostname) {
+        TreeVNCNode node = new TreeVNCNode(hostname,port,localhostname);
         node.setTreeNum(nodeList.size());
         nodeList.add(node);
 	    TreeVncProtocol treeProtocol = new TreeVncProtocol(hostname,port);
@@ -130,7 +133,7 @@
 	            treeProtocol.connectTo(parent.getHostname(),parent.getPort(),isLeader(node));
 	        } else {
 	            // connect to me
-	            treeProtocol.connectTo(nodeList.getFirst().getHostname(),nodeList.getFirst().getPort(),isLeader(node));
+	            treeProtocol.connectTo(localhostname,rfb.getAcceptPort(),isLeader(node));
 	        }
 	    } catch (IOException e) {
 	        // log
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeVNCNode.java	Fri Jun 13 01:19:08 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeVNCNode.java	Fri Jun 13 07:12:52 2014 +0900
@@ -4,11 +4,12 @@
     String hostname;
     int port;
     int treeNum;
-    // String myAddress;    // Do we need local socket address?  
+    String localhostname;
 
-    public TreeVNCNode(String hostname, int port) {
+    public TreeVNCNode(String hostname, int port, String localhostname) {
         this.hostname = hostname;
         this.port = port;
+        this.localhostname = localhostname;
     }
 
     public int getTreeNum() {
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java	Fri Jun 13 01:19:08 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java	Fri Jun 13 07:12:52 2014 +0900
@@ -72,7 +72,7 @@
 	private void initProxy1(String hostName) {
 		myRfb = new MyRfbProtoProxy();
 		myRfb.setVncProxy(this);
-		clients = new AcceptClient(hostName, vncport);
+		clients = new AcceptClient(hostName, vncport,myRfb);
 		isApplet = false;
 		setIsTreeVNC(true);
 		setConnectionParam(hostName,vncport);
@@ -192,8 +192,8 @@
 		return clients.getList();
 	}
 
-    public void replyCreateTree(String hostname, int port) {
-        clients.replyCreateTree(hostname,port);
+    public void replyCreateTree(String hostname, int port,String localhostname) {
+        clients.replyCreateTree(hostname,port,localhostname);
     }
 
     public void fixLostParent(String hostname, int port) {