changeset 514:887ebd993b3d

separate rfb broadcast
author mir3636
date Thu, 21 Feb 2019 16:52:21 +0900
parents b97fdcd337fe
children 91f5c9dc91c8
files Todo.txt src/main/java/com/glavsoft/rfb/protocol/Protocol.java src/main/java/jp/ac/u_ryukyu/treevnc/BroadcastRFBListener.java src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java src/viewer_swing/java/com/glavsoft/viewer/Viewer.java src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java
diffstat 11 files changed, 154 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/Todo.txt	Wed Feb 20 23:04:41 2019 +0900
+++ b/Todo.txt	Thu Feb 21 16:52:21 2019 +0900
@@ -5,6 +5,8 @@
         IPv6, IPv4 
       Command line
 
+    複数のルートがあるときにマルチキャストポートを複数にする
+    FindRootReply でそのポートを教える
 
 Wed Jan 30 18:55:55 JST 2019
    directconnection 時に nodeid を正しく設定する必要がある
--- a/src/main/java/com/glavsoft/rfb/protocol/Protocol.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/Protocol.java	Thu Feb 21 16:52:21 2019 +0900
@@ -203,6 +203,8 @@
         sendMessage(new SetPixelFormatMessage(pixelFormat));
         logger.fine("sent: " + pixelFormat);
 
+        rfb.startBroadcast(receiverTask);
+
         sendSupportedEncodingsMessage(settings);
         settings.addListener(this); // to support pixel format (color depth), and encodings changes
         settings.addListener(repaintController);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/BroadcastRFBListener.java	Thu Feb 21 16:52:21 2019 +0900
@@ -0,0 +1,124 @@
+package jp.ac.u_ryukyu.treevnc;
+
+import com.glavsoft.rfb.protocol.ProtocolContext.TreeCommand;
+import com.glavsoft.rfb.protocol.ReceiverTask;
+import com.glavsoft.transport.Reader;
+import com.glavsoft.viewer.ViewerInterface;
+import com.glavsoft.viewer.swing.ConnectionParams;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+
+import static com.glavsoft.rfb.protocol.ReceiverTask.FRAMEBUFFER_UPDATE;
+
+public class BroadcastRFBListener implements Runnable {
+    public static final String Ipv4McastAddr = "224.0.0.1";
+    public static final String Ipv6McastAddr = "ff02::1";
+    public static String McastAddr = Ipv4McastAddr;
+
+	static final int BufSize = 1024;
+	private ReceiverTask receiverTask;
+	private boolean stopFlag = false;
+	private TreeRFBProto rfb;
+	private MulticastSocket soc;
+	private SecurityManager securityManager;
+
+	public BroadcastRFBListener() {
+		try {
+			soc = createMulticastSocket();
+			System.out.println("FindRoot listening on "+ InetAddress.getByName(McastAddr));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+    public static MulticastSocket createMulticastSocket() throws IOException {
+        MulticastSocket soc = new MulticastSocket(ConnectionParams.DEFAULT_VNC_BROADCAST);
+		try {
+			soc.joinGroup(InetAddress.getByName(McastAddr));
+		} catch (SocketException e) {
+			System.out.println("join to " +  Ipv4McastAddr + " failed.");
+		}
+		try {
+			soc.joinGroup(InetAddress.getByName(Ipv6McastAddr));
+		} catch (SocketException e) {
+			System.out.println("join to " +  Ipv6McastAddr + " failed.");
+		}
+        return soc;
+    }
+
+    /**
+	 * 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 rfbBroadcastLoop() {
+		byte[] buf = new byte[BufSize];
+		try {
+
+            DatagramPacket recvPacket = new DatagramPacket(buf, BufSize);
+            while (!stopFlag) {
+				soc.receive(recvPacket);
+				String hostname = recvPacket.getAddress().getHostAddress();
+		        byte[] reply = recvPacket.getData();
+				int len = recvPacket.getLength();
+				boolean isTreeRoot = rfb.isTreeManager();
+				if (isTreeRoot && receiverTask != null ) {
+					receiverTask.setReader(new Reader(new ByteArrayInputStream(reply)));
+					if (receiverTask.getMessageId() == FRAMEBUFFER_UPDATE) {
+						receiverTask.framebufferUpdateMessage();
+					}
+				}
+			}
+		} catch (Exception e) {
+            System.out.println("tree-root-find-listener :" + e.getMessage());
+		}
+	}
+
+	public void multicastUpdateRectangle(ByteBuffer buf) {
+
+		try {
+			DatagramPacket sendPacket = new DatagramPacket(buf.array
+					(), buf.limit(), InetAddress.getByName(TreeRootFinderListener.Ipv6McastAddr), ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
+			soc.send(sendPacket);
+		} catch (IOException e) {
+			System.out.println("cannot send UpdateRectangle.");
+			e.printStackTrace();
+		}
+
+		try {
+			DatagramPacket sendPacket1 = new DatagramPacket(buf.array(), buf.limit(), InetAddress.getByName(TreeRootFinderListener.Ipv4McastAddr), ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
+			soc.send(sendPacket1);
+		} catch (IOException e) {
+			System.out.println("cannot send UpdateRectangle.");
+			e.printStackTrace();
+		}
+		soc.close();
+	}
+
+    public void run() {
+		rfbBroadcastLoop();
+	}
+
+    // it looks like that we never stop
+	public void setStopFlag(boolean stopFlag) {
+		this.stopFlag = stopFlag;
+	}
+
+	public boolean isStopFlag() {
+		return stopFlag;
+	}
+
+	public MulticastSocket getSocket() {
+		return soc;
+	}
+
+	public void init(TreeRFBProto rfb_, ReceiverTask receiverTask_) {
+		rfb = rfb_;
+		receiverTask = receiverTask_;
+	}
+}
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java	Thu Feb 21 16:52:21 2019 +0900
@@ -18,7 +18,6 @@
 		this.rfb = rfb;
         rfb.setConnectionParam(this);
 		getBcast = new FindRoot(rfb.acceptPort,this);
-		rfb.setFindRoot();
 	}
 
 	public synchronized void findTreeVncRoot() {
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java	Thu Feb 21 16:52:21 2019 +0900
@@ -38,11 +38,6 @@
         }
     }
 
-    public FindRoot(int port, MulticastSocket soc) {
-		this.port = port;
-		this.soc = soc;
-	}
-
     /**
      * send find root message.
      * 
@@ -77,25 +72,6 @@
 		soc.close();
 	}
 
-	public void multicastUpdateRectangle(ByteBuffer buf) {
 
-		try {
-			DatagramPacket sendPacket = new DatagramPacket(buf.array
-					(), buf.limit(), InetAddress.getByName(TreeRootFinderListener.Ipv6McastAddr), ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
-			soc.send(sendPacket);
-		} catch (IOException e) {
-			System.out.println("cannot send UpdateRectangle.");
-			e.printStackTrace();
-		}
-
-		try {
-			DatagramPacket sendPacket1 = new DatagramPacket(buf.array(), buf.limit(), InetAddress.getByName(TreeRootFinderListener.Ipv4McastAddr), ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
-			soc.send(sendPacket1);
-		} catch (IOException e) {
-			System.out.println("cannot send UpdateRectangle.");
-			e.printStackTrace();
-		}
-		soc.close();
-	}
 
 }
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Thu Feb 21 16:52:21 2019 +0900
@@ -6,6 +6,7 @@
 import com.glavsoft.rfb.encoding.decoder.FramebufferUpdateRectangle;
 import com.glavsoft.rfb.protocol.Protocol;
 import com.glavsoft.rfb.protocol.ProtocolContext;
+import com.glavsoft.rfb.protocol.ReceiverTask;
 import com.glavsoft.transport.Reader;
 import com.glavsoft.transport.Writer;
 import com.glavsoft.viewer.ConnectionPresenter;
@@ -817,7 +818,7 @@
         bufs.add(c1);
         if (isTreeManager && connectionPresenter.isUseMulticast()) {
             for(ByteBuffer buf : bufs)
-                findRoot.multicastUpdateRectangle(buf);
+                viewer.getRfbBroadcastListener().multicastUpdateRectangle(buf);
         } else
             multicastqueue.waitput(bufs);
     }
@@ -1036,9 +1037,12 @@
         this.sharingId = sharingId;
     }
 
-    public void setFindRoot() {
-        if (getCast!=null) {
-            findRoot = new FindRoot(acceptPort,getCast.getSocket());
+    public synchronized void startBroadcast(ReceiverTask receiverTask) {
+        BroadcastRFBListener rfbBroadcastListener = viewer.getRfbBroadcastListener();
+        rfbBroadcastListener.init(this, receiverTask);
+        if (rfbBroadcastListener.isStopFlag()) {
+            Thread rfbBroadcast = new Thread(rfbBroadcastListener, "RFBBroadcast");
+            rfbBroadcast.start();
         }
     }
 }
\ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java	Thu Feb 21 16:52:21 2019 +0900
@@ -18,7 +18,6 @@
     public static String McastAddr = Ipv4McastAddr;
 
 	static final int BufSize = 1024;
-	private ReceiverTask receiverTask;
 	private boolean stopFlag = false;
 	private ViewerInterface vps;
 	private MulticastSocket soc;
@@ -72,11 +71,6 @@
 
 					TreeVncProtocol t = new TreeVncProtocol(hostname, port);
 					t.findRootReply(vps.getRfb().getAcceptPort());
-				} else if (receiverTask != null && !vps.getRfb().isTreeManager()) {
-					receiverTask.setReader(new Reader(new ByteArrayInputStream(reply)));
-					if (receiverTask.getMessageId() == FRAMEBUFFER_UPDATE) {
-						receiverTask.framebufferUpdateMessage();
-					}
 				}
 			}
 		} catch (Exception e) {
--- a/src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java	Thu Feb 21 16:52:21 2019 +0900
@@ -7,6 +7,7 @@
 import com.glavsoft.viewer.swing.ConnectionParams;
 import com.glavsoft.viewer.swing.ParametersHandler;
 import com.glavsoft.viewer.swing.SwingConnectionWorkerFactory;
+import jp.ac.u_ryukyu.treevnc.BroadcastRFBListener;
 import jp.ac.u_ryukyu.treevnc.CreateConnectionParam;
 import jp.ac.u_ryukyu.treevnc.TreeRFBProto;
 
@@ -44,6 +45,7 @@
     public int width;
     public int height;
     private boolean useMulticast;
+    static public BroadcastRFBListener broadcastRFBListener = new BroadcastRFBListener();
 
     public static void main(String[] args) {
         Parser parser = new Parser();
@@ -176,6 +178,11 @@
     }
 
     @Override
+    public BroadcastRFBListener getRfbBroadcastListener() {
+        return broadcastRFBListener;
+    }
+
+    @Override
     public void windowOpened(WindowEvent e) { /* nop */
     }
 
--- a/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Thu Feb 21 16:52:21 2019 +0900
@@ -31,6 +31,7 @@
 import com.glavsoft.viewer.swing.ConnectionParams;
 import com.glavsoft.viewer.swing.ParametersHandler;
 import com.glavsoft.viewer.swing.SwingViewerWindow;
+import jp.ac.u_ryukyu.treevnc.BroadcastRFBListener;
 import jp.ac.u_ryukyu.treevnc.CreateConnectionParam;
 import jp.ac.u_ryukyu.treevnc.FindRoot;
 import jp.ac.u_ryukyu.treevnc.TreeRFBProto;
@@ -78,6 +79,7 @@
     public int fixingSizeWidth;
     public int fixingSizeHeight;
     private boolean useMulticast;
+    static public BroadcastRFBListener broadcastRFBListener = new BroadcastRFBListener();
 
     public static void main(String[] args) {
         Parser parser = new Parser();
@@ -360,6 +362,11 @@
         return useMulticast;
     }
 
+    @Override
+    public BroadcastRFBListener getRfbBroadcastListener() {
+        return broadcastRFBListener;
+    }
+
     private ConnectionPresenter createNewConnectionPresenter(String hostName, short newVNCServerId, int x, int y, int width, int height, int scale) {
         final boolean hasJsch = checkJsch();
         final boolean allowInteractive = allowAppletInteractiveConnections || ! isApplet;
@@ -445,7 +452,6 @@
         } else {
             myRfb.startTreeRootFindThread();
         }
-        myRfb.setFindRoot();
         setIsTreeVNC(true);
         if (hostName == null) {
             hostName = "localhost";
--- a/src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java	Thu Feb 21 16:52:21 2019 +0900
@@ -2,6 +2,7 @@
 
 import com.glavsoft.transport.Reader;
 import com.glavsoft.transport.Writer;
+import jp.ac.u_ryukyu.treevnc.BroadcastRFBListener;
 import jp.ac.u_ryukyu.treevnc.TreeRFBProto;
 
 import java.awt.*;
@@ -64,4 +65,6 @@
     public void setUseMulticast(boolean useMulticast) ;
 
     public boolean getUseMulticast();
+
+    BroadcastRFBListener getRfbBroadcastListener();
 }
--- a/src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java	Wed Feb 20 23:04:41 2019 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java	Thu Feb 21 16:52:21 2019 +0900
@@ -36,7 +36,7 @@
     public static final int DEFAULT_VNC_ROOT = 5950;
     public static final int DEFAULT_RTP_PORT = 60004;
     public static final int DEFAULT_VNC_ROOT_FINDER = DEFAULT_RFB_PORT;
-
+    public static final int DEFAULT_VNC_BROADCAST = 5901;
     
 	public String hostName;
 	private int portNumber;