Mercurial > hg > Members > riono > TreeVNC_ja_comment
view src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncProtocol.java @ 327:293c35aa902b
add error message, add assure stream close, delete firstTime value in TreeRFBProto.
author | oc |
---|---|
date | Sun, 01 Feb 2015 17:34:09 +0900 |
parents | 1d4d5055a288 |
children | 1a2ab6bd5ba3 |
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; private int singleWidth; private int singleHeight; public TreeVncProtocol(String name, int echoPort) { this.rootPort = echoPort; this.rootAddress = name; } public void setSingleSize(int singleWidth, int singleHeight) { this.singleWidth = singleWidth; this.singleHeight = singleHeight; } public void openport() throws IOException { echoSocket = new Socket(rootAddress, rootPort); // echoSocket.setReuseAddress(true); os = new DataOutputStream(echoSocket.getOutputStream()); is = new BufferedReader(new InputStreamReader( echoSocket.getInputStream())); } 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) { try { 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); } catch (IOException e) { System.out.println("cannot send command to the root."); streamClose(); } } 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 } void streamClose() { try { os.close(); is.close(); echoSocket.close(); } catch (IOException e) { e.printStackTrace(); System.out.println("cannot close stream."); } } }