view src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java @ 513:b97fdcd337fe

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 20 Feb 2019 23:04:41 +0900
parents d409e89ec8ec
children 887ebd993b3d
line wrap: on
line source

package jp.ac.u_ryukyu.treevnc;

import com.glavsoft.rfb.protocol.ProtocolContext.TreeCommand;
import com.glavsoft.viewer.swing.ConnectionParams;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class FindRoot {
	final int BUFSIZE = 1024;
	private MulticastSocket soc;
    private InetAddress mAddr;
    private ServerSocket server = null;
    private BufferedReader is;
    private int port;
    private boolean stopFlag = false;
    private String proxyAddr;

    /**
     * To find vnc root, a client sends a multicast packet.
     * @param _port    TreeVNC waiting port
     * @param createConnectionParam  no use now
     */
	public FindRoot(int _port, CreateConnectionParam createConnectionParam) {
        port = _port;
        try {
            soc = TreeRootFinderListener.createMulticastSocket();
            mAddr = InetAddress.getByName(TreeRootFinderListener.McastAddr);
            System.out.println("FindRoot socket on " + TreeRootFinderListener.McastAddr + " "  + mAddr + " port " + _port);
        } catch (IOException e) {
            System.out.println("cannot create FindRoot socket. " + e);
        }
    }

    public FindRoot(int port, MulticastSocket soc) {
		this.port = port;
		this.soc = soc;
	}

    /**
     * send find root message.
     * 
     */
	public void findRoot() {
		ByteBuffer buf = ByteBuffer.allocate(12);
		buf.order(ByteOrder.BIG_ENDIAN);
		buf.put((byte) TreeCommand.FIND_ROOT.cmd);
		buf.put((byte) 0);
		buf.put((byte) 0);
		buf.put((byte) 0);
		buf.putInt(4); // length
		buf.putInt(port);
		buf.flip();


		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 FindRoot packet.");
			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 FindRoot packet.");
			e.printStackTrace();
		}
		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();
	}

}