# HG changeset patch # User mir3636 # Date 1550735541 -32400 # Node ID 887ebd993b3dd055e57d9bef546cb503c938b104 # Parent b97fdcd337feefb450f5811dfa8e30b808eb9863 separate rfb broadcast diff -r b97fdcd337fe -r 887ebd993b3d Todo.txt --- 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 を正しく設定する必要がある diff -r b97fdcd337fe -r 887ebd993b3d src/main/java/com/glavsoft/rfb/protocol/Protocol.java --- 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); diff -r b97fdcd337fe -r 887ebd993b3d src/main/java/jp/ac/u_ryukyu/treevnc/BroadcastRFBListener.java --- /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_; + } +} diff -r b97fdcd337fe -r 887ebd993b3d src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java --- 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() { diff -r b97fdcd337fe -r 887ebd993b3d src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java --- 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(); - } } diff -r b97fdcd337fe -r 887ebd993b3d src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java --- 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 diff -r b97fdcd337fe -r 887ebd993b3d src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java --- 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) { diff -r b97fdcd337fe -r 887ebd993b3d src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java --- 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 */ } diff -r b97fdcd337fe -r 887ebd993b3d src/viewer_swing/java/com/glavsoft/viewer/Viewer.java --- 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"; diff -r b97fdcd337fe -r 887ebd993b3d src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java --- 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(); } diff -r b97fdcd337fe -r 887ebd993b3d src/viewer_swing/java/com/glavsoft/viewer/swing/ConnectionParams.java --- 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;