Mercurial > hg > Members > riono > TreeVNC_ja_comment
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_; + } +}