Mercurial > hg > Applications > TreeVNC
annotate src/main/java/jp/ac/u_ryukyu/treevnc/server/TreeRootFinderListener.java @ 134:128cce60c43c
where to connect command
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 07 Jun 2014 15:57:03 +0900 |
parents | src/main/java/jp/ac/u_ryukyu/treevnc/server/GetBroadCastProxy.java@775ce6a14f89 |
children | 1c95bd5bebcf |
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; |
10 | |
11 import com.glavsoft.rfb.protocol.ProtocolContext; | |
82 | 12 import com.glavsoft.viewer.swing.ConnectionParams; |
13 | |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
126
diff
changeset
|
14 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
|
15 public static final String McastAddr = "224.0.0.1"; |
11 | 16 static final int BufSize = 1024; |
17 private boolean stopFlag = false; | |
18 private VncProxyService vps; | |
69 | 19 private MulticastSocket soc; |
11 | 20 |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
126
diff
changeset
|
21 public TreeRootFinderListener(VncProxyService _vps) { |
11 | 22 vps = _vps; |
23 } | |
24 | |
81
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
25 /** |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
26 * 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
|
27 * 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
|
28 */ |
f93d0286c2ab
root find multicast send port number now.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
80
diff
changeset
|
29 private void replyToRootSearchMulticast() { |
55 | 30 byte[] buf = new byte[BufSize]; |
11 | 31 try { |
32 InetAddress mAddr = InetAddress.getByName(McastAddr); | |
82 | 33 soc = new MulticastSocket(ConnectionParams.DEFAULT_VNC_ROOT_FINDER); |
11 | 34 DatagramPacket recvPacket = new DatagramPacket(buf, BufSize); |
35 soc.joinGroup(mAddr); | |
55 | 36 while (!stopFlag) { |
11 | 37 soc.receive(recvPacket); |
82 | 38 byte[] reply = recvPacket.getData(); |
39 int len = recvPacket.getLength(); | |
126 | 40 if (len != 12) { |
41 continue; | |
42 } | |
43 if ((reply[0]&0xff) != ProtocolContext.FIND_ROOT) { | |
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 | |
52 TreeVncProtocol t = new TreeVncProtocol("", port); | |
53 try { | |
54 t.findRootReply(getMyAddress(), vps.getRfb().getAcceptPort()); | |
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 } |