diff src/main/java/jp/ac/u_ryukyu/treevnc/BroadcastRFBListener.java @ 514:887ebd993b3d

separate rfb broadcast
author mir3636
date Thu, 21 Feb 2019 16:52:21 +0900
parents src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java@b97fdcd337fe
children 91f5c9dc91c8
line wrap: on
line diff
--- /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_;
+	}
+}