Mercurial > hg > Members > riono > TreeVNC_ja_comment
view src/main/java/jp/ac/u_ryukyu/treevnc/client/GetHostClient.java @ 125:32c6563492f3
add vnc protocol command sender.
author | oc |
---|---|
date | Thu, 05 Jun 2014 18:30:45 +0900 |
parents | 233e94a7b5ed |
children | 775ce6a14f89 |
line wrap: on
line source
package jp.ac.u_ryukyu.treevnc.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.BindException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.ServerSocket; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.ByteOrder; import com.glavsoft.rfb.protocol.ProtocolContext; import com.glavsoft.viewer.swing.ConnectionParams; import jp.ac.u_ryukyu.treevnc.server.GetBroadCastProxy; public class GetHostClient implements Runnable { final int BUFSIZE = 1024; private byte[] buf = new byte[BUFSIZE]; private InetAddress mAddr; private MulticastSocket soc; private String str; private ServerSocket server = null; private BufferedReader is; private int port = ConnectionParams.DEFAULT_VNC_ROOT_FINDER; private boolean stopFlag; private TextBoxClient text = new TextBoxClient(); private String proxyAddr; /** * To find vnc root, a client sends a multicast packet. * @param _str */ public GetHostClient(String _str) { str = _str; } public void createSocket() { do { try { server = new ServerSocket(port); } catch (BindException e){ port ++; } catch (IOException e) { // can't open socket } } while (server == null); try { mAddr = InetAddress.getByName(GetBroadCastProxy.McastAddr); soc = new MulticastSocket(); soc.setTimeToLive(1); } catch (IOException e) { e.printStackTrace(); } } /** * send find root message. * */ public void sendData() { String s = str + Integer.toString(port); buf = s.getBytes(); DatagramPacket sendPacket = new DatagramPacket(buf, s.length(), mAddr, ConnectionParams.DEFAULT_VNC_ROOT_FINDER); try { soc.send(sendPacket); } catch (IOException e) { e.printStackTrace(); } } public void getHost() { createSocket(); sendData(); } public void findRoot() { ByteBuffer buf = ByteBuffer.allocate(12); buf.order(ByteOrder.BIG_ENDIAN); buf.put((byte) ProtocolContext.FIND_ROOT); buf.put((byte) 0); buf.put((byte) 0); buf.put((byte) 0); buf.putInt(4); // length buf.putInt(port); buf.flip(); DatagramPacket sendPacket = new DatagramPacket(buf.array(), buf.limit(), mAddr, ConnectionParams.DEFAULT_VNC_ROOT_FINDER); try { soc.send(sendPacket); } catch (IOException e) { e.printStackTrace(); } } /** * @return * reply to findRootMassage * */ public String textAddress() { return text.getAddress(); } public String textPort() { return text.getPort(); } void socketClose() { try { text.unVisible(); is.close(); } catch (IOException e) { e.printStackTrace(); } } /** * TREEVNC_ROOT_FINDER is sent, wait for reply */ @Override public void run() { try { while(!stopFlag) { Socket socket = server.accept(); is = new BufferedReader(new InputStreamReader( socket.getInputStream())); proxyAddr = is.readLine(); // proxyAddr format // 5999:localhost:localhost:133.13.59.210: // port:hostnae:hostname:ip address: // GetBroadCastProxy create this string on VNC root InetAddress adr = socket.getInetAddress(); String proxyAddr1 = adr.getHostName(); if (proxyAddr1 != null) { int portIndex = proxyAddr.indexOf(":"); int restIndex = proxyAddr.indexOf(":", portIndex+1); if (portIndex>0) { proxyAddr = proxyAddr.substring(0, portIndex)+":"+proxyAddr1 + ":" + proxyAddr.substring(restIndex+1); } } if(proxyAddr!=null) text.checkBox(proxyAddr); text.setButton(); text.visible(); } System.err.println("stop"); } catch (IOException e) { } } public void setStopFlag(boolean stopFlag) { this.stopFlag = stopFlag; } /** * the thread is waiting accept system call, * close the socket causes exception, * which will terminated the thread. * */ public void interrupt() { stopFlag = true; try { server.close(); soc.close(); } catch (IOException e) { } Thread.currentThread().interrupt(); } public boolean isStopFlag() { return stopFlag; } public void ipRegister() { text.ipRegister(); } public String getProxyAddr() { return proxyAddr; } }