view src/main/java/jp/ac/u_ryukyu/treevnc/BroadcastRFBListener.java @ 523:dca83cc39438

fix
author mir3636
date Sun, 24 Feb 2019 16:47:30 +0900
parents 3fc0fedbc3fd
children ef2f70aee45a
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*64;
	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() {
		while (!stopFlag) {
			try {
				byte[] buf = new byte[BufSize];
				DatagramPacket recvPacket = new DatagramPacket(buf, BufSize);				soc.receive(recvPacket);
				String hostname = recvPacket.getAddress().getHostAddress();
				byte[] reply = recvPacket.getData();
				int len = recvPacket.getLength();
				boolean isTreeRoot = rfb.isTreeManager();
				if (receiverTask != null) {
					receiverTask.setReader(new Reader(new ByteArrayInputStream(reply)));
					if (receiverTask.getMessageId() == FRAMEBUFFER_UPDATE) {
						receiverTask.framebufferUpdateMessage();
					}
				}
			} catch (Exception e) {
				System.out.println("broadcast-rfb-listener :" + e.getMessage());
			}
		}
	}

	public void multicastUpdateRectangle(ByteBuffer buf) {

		/*try {
			DatagramPacket sendPacket = new DatagramPacket(buf.array
					(), buf.limit(), InetAddress.getByName(TreeRootFinderListener.Ipv6McastAddr), ConnectionParams.DEFAULT_VNC_BROADCAST);
			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_BROADCAST);
			soc.send(sendPacket1);
		} catch (IOException e) {
			System.out.println("cannot send UpdateRectangle.");
			e.printStackTrace();
		}
	}

    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_;
	}
}