Mercurial > hg > Members > riono > TreeVNC_ja_comment
annotate src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeRootFinderListener.java @ 159:1c9f6acdfeb2
TreeCommand enum
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 14 Jun 2014 09:22:52 +0900 |
parents | 1c95bd5bebcf |
children | 2e1530139169 |
rev | line source |
---|---|
12 | 1 package jp.ac.u_ryukyu.treevnc.server; |
11 | 2 |
3 import java.io.IOException; | |
4 import java.net.DatagramPacket; | |
5 import java.net.InetAddress; | |
6 import java.net.MulticastSocket; | |
13 | 7 import java.net.UnknownHostException; |
11 | 8 |
126 | 9 import jp.ac.u_ryukyu.treevnc.client.TreeVncProtocol; |
159 | 10 import com.glavsoft.rfb.protocol.ProtocolContext.TreeCommand; |
82 | 11 import com.glavsoft.viewer.swing.ConnectionParams; |
12 | |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
126
diff
changeset
|
13 public class TreeRootFinderListener implements Runnable { |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
14 public static final String McastAddr = "224.0.0.1"; |
11 | 15 static final int BufSize = 1024; |
16 private boolean stopFlag = false; | |
17 private VncProxyService vps; | |
69 | 18 private MulticastSocket soc; |
11 | 19 |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
126
diff
changeset
|
20 public TreeRootFinderListener(VncProxyService _vps) { |
11 | 21 vps = _vps; |
22 } | |
23 | |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
24 /** |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
25 * To find TreeVNC root, a client sends me a multicast, reply our address to him. |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
26 * It contains a port to receive, so multiple TREEVNC clients can run on a PC. |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
27 */ |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
28 private void replyToRootSearchMulticast() { |
55 | 29 byte[] buf = new byte[BufSize]; |
11 | 30 try { |
31 InetAddress mAddr = InetAddress.getByName(McastAddr); | |
82 | 32 soc = new MulticastSocket(ConnectionParams.DEFAULT_VNC_ROOT_FINDER); |
11 | 33 DatagramPacket recvPacket = new DatagramPacket(buf, BufSize); |
34 soc.joinGroup(mAddr); | |
55 | 35 while (!stopFlag) { |
11 | 36 soc.receive(recvPacket); |
155 | 37 String hostname = recvPacket.getAddress().getHostAddress(); |
82 | 38 byte[] reply = recvPacket.getData(); |
39 int len = recvPacket.getLength(); | |
126 | 40 if (len != 12) { |
41 continue; | |
42 } | |
159 | 43 if ((reply[0]&0xff) != TreeCommand.FIND_ROOT.cmd) { |
126 | 44 continue; |
11 | 45 } |
126 | 46 int port = 0; |
47 port = reply[8]; | |
48 port = port * 256 + reply[9]; | |
49 port = port * 256 + reply[10]; | |
50 port = port * 256 + reply[11]; | |
51 | |
155 | 52 TreeVncProtocol t = new TreeVncProtocol(hostname, port); |
126 | 53 try { |
155 | 54 t.findRootReply(vps.getRfb().getAcceptPort()); |
126 | 55 } catch (IOException e) { |
56 e.printStackTrace(); | |
57 } | |
38 | 58 if(stopFlag) break; |
11 | 59 } |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
60 } catch (Exception e) { |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
61 |
11 | 62 } |
63 } | |
64 | |
82 | 65 public int parse_code( byte[] bs,int offset,int len ) |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
66 { |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
67 int intval = 0; |
82 | 68 for( int i = offset; i < len ; i++ ) { |
69 if (bs[i]==0 ) return intval; | |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
70 intval = intval * 10 + ( bs[ i ] - '0' ); |
82 | 71 } |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
72 return intval; |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
73 } |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
74 |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
75 |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
126
diff
changeset
|
76 public void run() { |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
77 replyToRootSearchMulticast(); |
11 | 78 } |
79 | |
80 public void setStopFlag(boolean stopFlag) { | |
81 this.stopFlag = stopFlag; | |
82 } | |
83 | |
84 public boolean isStopFlag() { | |
85 return stopFlag; | |
86 } | |
13 | 87 |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
88 /** |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
89 * getLocalHost() returns hostname's address. It may not connectable, but |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
90 * it gives readable hostname. Do not use it to connect. |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
91 * @return |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
92 */ |
13 | 93 String getMyAddress () { |
94 InetAddress addr = null; | |
95 try { | |
96 addr = InetAddress.getLocalHost(); | |
97 } catch (UnknownHostException e) { | |
80
2951dd85e9fc
connect to real connection address instead of bad getLocalAddress().
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
78
diff
changeset
|
98 return "localhost"; |
13 | 99 } |
80
2951dd85e9fc
connect to real connection address instead of bad getLocalAddress().
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
78
diff
changeset
|
100 return addr.getHostAddress(); |
13 | 101 } |
11 | 102 } |