Mercurial > hg > Applications > TreeVNC
annotate src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java @ 269:05f59c18cdca
fix --filterSingleDisplay option
author | oc |
---|---|
date | Tue, 09 Dec 2014 11:08:32 +0900 |
parents | 2b3eb4a9492f |
children | 61938de1dd06 |
rev | line source |
---|---|
206 | 1 package jp.ac.u_ryukyu.treevnc; |
1 | 2 |
82 | 3 import java.io.BufferedReader; |
1 | 4 import java.io.IOException; |
82 | 5 import java.io.InputStreamReader; |
1 | 6 import java.net.DatagramPacket; |
7 import java.net.InetAddress; | |
8 import java.net.MulticastSocket; | |
82 | 9 import java.net.ServerSocket; |
10 import java.net.Socket; | |
125 | 11 import java.nio.ByteBuffer; |
12 import java.nio.ByteOrder; | |
206 | 13 |
159 | 14 import com.glavsoft.rfb.protocol.ProtocolContext.TreeCommand; |
82 | 15 import com.glavsoft.viewer.swing.ConnectionParams; |
16 | |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
131
diff
changeset
|
17 public class FindRoot implements Runnable { |
1 | 18 final int BUFSIZE = 1024; |
19 private InetAddress mAddr; | |
20 private MulticastSocket soc; | |
21 | |
82 | 22 private ServerSocket server = null; |
23 private BufferedReader is; | |
126 | 24 private int port; |
82 | 25 private boolean stopFlag; |
129 | 26 private TreeVncRootSelectionPanel rootSelectionPanel = new TreeVncRootSelectionPanel(); |
82 | 27 private String proxyAddr; |
28 | |
125 | 29 /** |
30 * To find vnc root, a client sends a multicast packet. | |
130 | 31 * @param createConnectionParam |
125 | 32 * @param _str |
33 */ | |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
131
diff
changeset
|
34 public FindRoot(int _port, CreateConnectionParam createConnectionParam) { |
130 | 35 CreateConnectionParam cp = createConnectionParam; |
126 | 36 port = _port; |
130 | 37 rootSelectionPanel.setCp(cp); |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
131
diff
changeset
|
38 createSocket(); |
87 | 39 } |
82 | 40 |
127 | 41 public void createSocket() { |
1 | 42 try { |
134
128cce60c43c
where to connect command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
131
diff
changeset
|
43 mAddr = InetAddress.getByName(TreeRootFinderListener.McastAddr); |
1 | 44 soc = new MulticastSocket(); |
45 soc.setTimeToLive(1); | |
46 } catch (IOException e) { | |
47 e.printStackTrace(); | |
48 } | |
49 } | |
50 | |
130 | 51 /** |
52 * send find root message. | |
53 * | |
54 */ | |
125 | 55 public void findRoot() { |
56 ByteBuffer buf = ByteBuffer.allocate(12); | |
57 buf.order(ByteOrder.BIG_ENDIAN); | |
159 | 58 buf.put((byte) TreeCommand.FIND_ROOT.cmd); |
125 | 59 buf.put((byte) 0); |
60 buf.put((byte) 0); | |
61 buf.put((byte) 0); | |
62 buf.putInt(4); // length | |
63 buf.putInt(port); | |
64 buf.flip(); | |
65 | |
66 DatagramPacket sendPacket = new DatagramPacket(buf.array(), buf.limit(), mAddr, ConnectionParams.DEFAULT_VNC_ROOT_FINDER); | |
67 try { | |
68 soc.send(sendPacket); | |
69 } catch (IOException e) { | |
70 e.printStackTrace(); | |
71 } | |
72 | |
73 } | |
82 | 74 |
75 public String textPort() { | |
129 | 76 return rootSelectionPanel.getPort(); |
82 | 77 } |
78 | |
79 void socketClose() { | |
80 try { | |
129 | 81 rootSelectionPanel.unVisible(); |
82 | 82 is.close(); |
83 } catch (IOException e) { | |
84 e.printStackTrace(); | |
85 } | |
86 } | |
87 | |
88 /** | |
89 * TREEVNC_ROOT_FINDER is sent, wait for reply | |
90 */ | |
91 @Override | |
92 public void run() { | |
93 try { | |
94 while(!stopFlag) { | |
139 | 95 Socket socket = server.accept(); |
82 | 96 is = new BufferedReader(new InputStreamReader( |
97 socket.getInputStream())); | |
98 proxyAddr = is.readLine(); | |
99 // proxyAddr format | |
100 // 5999:localhost:localhost:133.13.59.210: | |
101 // port:hostnae:hostname:ip address: | |
102 // GetBroadCastProxy create this string on VNC root | |
103 InetAddress adr = socket.getInetAddress(); | |
104 String proxyAddr1 = adr.getHostName(); | |
129 | 105 String proxyAddr2 = null; |
82 | 106 if (proxyAddr1 != null) { |
107 int portIndex = proxyAddr.indexOf(":"); | |
108 int restIndex = proxyAddr.indexOf(":", portIndex+1); | |
109 if (portIndex>0) { | |
129 | 110 proxyAddr2 = proxyAddr.substring(0, portIndex)+":"+proxyAddr1 + ":" + proxyAddr.substring(restIndex+1); |
82 | 111 } |
112 } | |
129 | 113 if(proxyAddr2!=null) |
114 rootSelectionPanel.checkBox(proxyAddr2); | |
115 rootSelectionPanel.setButton(); | |
116 rootSelectionPanel.visible(); | |
82 | 117 } |
87 | 118 System.err.println("stop"); |
82 | 119 } catch (IOException e) { |
120 } | |
121 } | |
122 | |
123 public void setStopFlag(boolean stopFlag) { | |
124 this.stopFlag = stopFlag; | |
125 | |
126 } | |
88 | 127 |
128 /** | |
129 * the thread is waiting accept system call, | |
130 * close the socket causes exception, | |
131 * which will terminated the thread. | |
132 * | |
133 */ | |
82 | 134 public void interrupt() { |
87 | 135 stopFlag = true; |
136 try { | |
137 server.close(); | |
138 soc.close(); | |
139 } catch (IOException e) { | |
140 } | |
82 | 141 Thread.currentThread().interrupt(); |
142 } | |
143 | |
144 public boolean isStopFlag() { | |
145 return stopFlag; | |
146 } | |
147 | |
148 public void ipRegister() { | |
129 | 149 rootSelectionPanel.ipRegister(); |
82 | 150 } |
151 | |
152 public String getProxyAddr() { | |
153 return proxyAddr; | |
154 } | |
1 | 155 } |