# HG changeset patch # User Shinji KONO # Date 1402611172 -32400 # Node ID 703db66138b5f54ec5e2a6ae702fde55488a06aa # Parent 5be1d92e783505dba7c8e97ee7d2ffc13b398274 WhereToConnect diff -r 5be1d92e7835 -r 703db66138b5 src/main/java/jp/ac/u_ryukyu/treevnc/MyRfbProto.java --- 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) { diff -r 5be1d92e7835 -r 703db66138b5 src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncCommand.java --- 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); } /** diff -r 5be1d92e7835 -r 703db66138b5 src/main/java/jp/ac/u_ryukyu/treevnc/client/TreeVncProtocol.java --- 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 diff -r 5be1d92e7835 -r 703db66138b5 src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java --- 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 diff -r 5be1d92e7835 -r 703db66138b5 src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeVNCNode.java --- 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() { diff -r 5be1d92e7835 -r 703db66138b5 src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java --- 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) {