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