view src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncProtocol.java @ 206:2b3eb4a9492f

MyRfbProto reorganization
author oc
date Wed, 02 Jul 2014 17:58:55 +0900
parents src/main/java/jp/ac/u_ryukyu/treevnc/client/TreeVncProtocol.java@2e1530139169
children dd154ffe1a53
line wrap: on
line source

package jp.ac.u_ryukyu.treevnc;

import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import com.glavsoft.rfb.protocol.ProtocolContext.TreeCommand;

public class TreeVncProtocol {
	private BufferedReader is = null;
	private DataOutputStream os = null;
	private Socket echoSocket = null;
	private int rootPort;
	private String rootAddress;
	
	public TreeVncProtocol(String name, int echoPort) {
		this.rootPort = echoPort;
		this.rootAddress = name;
	}

	public void openport() {
		try {
			echoSocket = new Socket(rootAddress, rootPort);
			// echoSocket.setReuseAddress(true);
			os = new DataOutputStream(echoSocket.getOutputStream());
			is = new BufferedReader(new InputStreamReader(
					echoSocket.getInputStream()));
		} catch (UnknownHostException e) {
			System.err.println("Don't know about host: "+rootAddress);
		} catch (IOException e) {
			System.out.println(rootAddress + " Connection Faild");
			System.exit(0);
		}
	}

	public void findRootReply(int port) throws IOException {
		sendWithHostAndPort(TreeCommand.FIND_ROOT_REPLY, null, port, (short) 0);
	}

	public void whereToConnect(String hostname, int port) throws IOException {
        sendWithHostAndPort(TreeCommand.WHERE_TO_CONNECT, hostname, port, (short) 0);
	}

	public void connectTo(String hostname, int port,int leaderFlag, short yourId) throws IOException{
	    TreeCommand command = leaderFlag == 1 ? TreeCommand.CONNECT_TO_AS_LEADER : TreeCommand.CONNECT_TO;
        sendWithHostAndPort(command , hostname, port, yourId);
 	}

	public void lostParent(String hostname, int port) throws IOException {
        sendWithHostAndPort(TreeCommand.LOST_PARENT, hostname, port, (short) 0);
	}
	
	public void sendWithHostAndPort(TreeCommand command, String hostname, int port, short value)
			throws IOException {
		openport();
		if (hostname == null) {
			// in case of root finder, we can't get localaddress from datagram packet.
			// so use local part of TCP socket.
			hostname = echoSocket.getLocalAddress().getHostAddress();
		}
		int cmdlen = 4+4+4+hostname.length();
		if (cmdlen < 12) cmdlen=12;
		ByteBuffer buf = ByteBuffer.allocate(cmdlen);
		buf.order(ByteOrder.BIG_ENDIAN);
		buf.put((byte) command.cmd);
		
		buf.put((byte) 0);
		buf.putShort(value);
		buf.putInt(4+hostname.length()); // length
		buf.putInt(port);
		buf.put(hostname.getBytes(), 0, hostname.length());
		while (buf.hasRemaining() ) buf.put((byte)0) ;
        buf.flip();
		sendCommandToTheRoot(buf);
	}

    public void sendCommandToTheRoot(ByteBuffer buf) throws IOException {
        char[] charBuf = new char[12];
        is.read(charBuf , 0, 12);                       // skip root's version header
        os.write(buf.array(), 0, buf.limit());         // send our command
        streamClose();
    }

	void streamClose() throws IOException {
		os.close();
		is.close();
		echoSocket.close();
	}

}