001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package examples;
019
020 import java.io.InputStream;
021 import java.io.OutputStream;
022 import java.io.FileOutputStream;
023 import java.io.IOException;
024 import org.apache.commons.net.telnet.TelnetClient;
025 import org.apache.commons.net.telnet.TelnetNotificationHandler;
026 import org.apache.commons.net.telnet.SimpleOptionHandler;
027 import org.apache.commons.net.telnet.EchoOptionHandler;
028 import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
029 import org.apache.commons.net.telnet.SuppressGAOptionHandler;
030 import org.apache.commons.net.telnet.InvalidTelnetOptionException;
031 import java.util.StringTokenizer;
032
033
034 /***
035 * This is a simple example of use of TelnetClient.
036 * An external option handler (SimpleTelnetOptionHandler) is used.
037 * Initial configuration requested by TelnetClient will be:
038 * WILL ECHO, WILL SUPPRESS-GA, DO SUPPRESS-GA.
039 * VT100 terminal type will be subnegotiated.
040 * <p>
041 * Also, use of the sendAYT(), getLocalOptionState(), getRemoteOptionState()
042 * is demonstrated.
043 * When connected, type AYT to send an AYT command to the server and see
044 * the result.
045 * Type OPT to see a report of the state of the first 25 options.
046 * <p>
047 * @author Bruno D'Avanzo
048 ***/
049 public class TelnetClientExample implements Runnable, TelnetNotificationHandler
050 {
051 static TelnetClient tc = null;
052
053 /***
054 * Main for the TelnetClientExample.
055 ***/
056 public static void main(String[] args) throws IOException
057 {
058 FileOutputStream fout = null;
059
060 if(args.length < 1)
061 {
062 System.err.println("Usage: TelnetClientExample1 <remote-ip> [<remote-port>]");
063 System.exit(1);
064 }
065
066 String remoteip = args[0];
067
068 int remoteport;
069
070 if (args.length > 1)
071 {
072 remoteport = (new Integer(args[1])).intValue();
073 }
074 else
075 {
076 remoteport = 23;
077 }
078
079 try
080 {
081 fout = new FileOutputStream ("spy.log", true);
082 }
083 catch (Exception e)
084 {
085 System.err.println(
086 "Exception while opening the spy file: "
087 + e.getMessage());
088 }
089
090 tc = new TelnetClient();
091
092 TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, false);
093 EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false);
094 SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true, true, true);
095
096 try
097 {
098 tc.addOptionHandler(ttopt);
099 tc.addOptionHandler(echoopt);
100 tc.addOptionHandler(gaopt);
101 }
102 catch (InvalidTelnetOptionException e)
103 {
104 System.err.println("Error registering option handlers: " + e.getMessage());
105 }
106
107 while (true)
108 {
109 boolean end_loop = false;
110 try
111 {
112 tc.connect(remoteip, remoteport);
113
114
115 Thread reader = new Thread (new TelnetClientExample());
116 tc.registerNotifHandler(new TelnetClientExample());
117 System.out.println("TelnetClientExample");
118 System.out.println("Type AYT to send an AYT telnet command");
119 System.out.println("Type OPT to print a report of status of options (0-24)");
120 System.out.println("Type REGISTER to register a new SimpleOptionHandler");
121 System.out.println("Type UNREGISTER to unregister an OptionHandler");
122 System.out.println("Type SPY to register the spy (connect to port 3333 to spy)");
123 System.out.println("Type UNSPY to stop spying the connection");
124
125 reader.start();
126 OutputStream outstr = tc.getOutputStream();
127
128 byte[] buff = new byte[1024];
129 int ret_read = 0;
130
131 do
132 {
133 try
134 {
135 ret_read = System.in.read(buff);
136 if(ret_read > 0)
137 {
138 if((new String(buff, 0, ret_read)).startsWith("AYT"))
139 {
140 try
141 {
142 System.out.println("Sending AYT");
143
144 System.out.println("AYT response:" + tc.sendAYT(5000));
145 }
146 catch (Exception e)
147 {
148 System.err.println("Exception waiting AYT response: " + e.getMessage());
149 }
150 }
151 else if((new String(buff, 0, ret_read)).startsWith("OPT"))
152 {
153 System.out.println("Status of options:");
154 for(int ii=0; ii<25; ii++)
155 System.out.println("Local Option " + ii + ":" + tc.getLocalOptionState(ii) + " Remote Option " + ii + ":" + tc.getRemoteOptionState(ii));
156 }
157 else if((new String(buff, 0, ret_read)).startsWith("REGISTER"))
158 {
159 StringTokenizer st = new StringTokenizer(new String(buff));
160 try
161 {
162 st.nextToken();
163 int opcode = (new Integer(st.nextToken())).intValue();
164 boolean initlocal = (new Boolean(st.nextToken())).booleanValue();
165 boolean initremote = (new Boolean(st.nextToken())).booleanValue();
166 boolean acceptlocal = (new Boolean(st.nextToken())).booleanValue();
167 boolean acceptremote = (new Boolean(st.nextToken())).booleanValue();
168 SimpleOptionHandler opthand = new SimpleOptionHandler(opcode, initlocal, initremote,
169 acceptlocal, acceptremote);
170 tc.addOptionHandler(opthand);
171 }
172 catch (Exception e)
173 {
174 if(e instanceof InvalidTelnetOptionException)
175 {
176 System.err.println("Error registering option: " + e.getMessage());
177 }
178 else
179 {
180 System.err.println("Invalid REGISTER command.");
181 System.err.println("Use REGISTER optcode initlocal initremote acceptlocal acceptremote");
182 System.err.println("(optcode is an integer.)");
183 System.err.println("(initlocal, initremote, acceptlocal, acceptremote are boolean)");
184 }
185 }
186 }
187 else if((new String(buff, 0, ret_read)).startsWith("UNREGISTER"))
188 {
189 StringTokenizer st = new StringTokenizer(new String(buff));
190 try
191 {
192 st.nextToken();
193 int opcode = (new Integer(st.nextToken())).intValue();
194 tc.deleteOptionHandler(opcode);
195 }
196 catch (Exception e)
197 {
198 if(e instanceof InvalidTelnetOptionException)
199 {
200 System.err.println("Error unregistering option: " + e.getMessage());
201 }
202 else
203 {
204 System.err.println("Invalid UNREGISTER command.");
205 System.err.println("Use UNREGISTER optcode");
206 System.err.println("(optcode is an integer)");
207 }
208 }
209 }
210 else if((new String(buff, 0, ret_read)).startsWith("SPY"))
211 {
212 try
213 {
214 tc.registerSpyStream(fout);
215 }
216 catch (Exception e)
217 {
218 System.err.println("Error registering the spy");
219 }
220 }
221 else if((new String(buff, 0, ret_read)).startsWith("UNSPY"))
222 {
223 tc.stopSpyStream();
224 }
225 else
226 {
227 try
228 {
229 outstr.write(buff, 0 , ret_read);
230 outstr.flush();
231 }
232 catch (Exception e)
233 {
234 end_loop = true;
235 }
236 }
237 }
238 }
239 catch (Exception e)
240 {
241 System.err.println("Exception while reading keyboard:" + e.getMessage());
242 end_loop = true;
243 }
244 }
245 while((ret_read > 0) && (end_loop == false));
246
247 try
248 {
249 tc.disconnect();
250 }
251 catch (Exception e)
252 {
253 System.err.println("Exception while connecting:" + e.getMessage());
254 }
255 }
256 catch (Exception e)
257 {
258 System.err.println("Exception while connecting:" + e.getMessage());
259 System.exit(1);
260 }
261 }
262 }
263
264
265 /***
266 * Callback method called when TelnetClient receives an option
267 * negotiation command.
268 * <p>
269 * @param negotiation_code - type of negotiation command received
270 * (RECEIVED_DO, RECEIVED_DONT, RECEIVED_WILL, RECEIVED_WONT)
271 * <p>
272 * @param option_code - code of the option negotiated
273 * <p>
274 ***/
275 public void receivedNegotiation(int negotiation_code, int option_code)
276 {
277 String command = null;
278 if(negotiation_code == TelnetNotificationHandler.RECEIVED_DO)
279 {
280 command = "DO";
281 }
282 else if(negotiation_code == TelnetNotificationHandler.RECEIVED_DONT)
283 {
284 command = "DONT";
285 }
286 else if(negotiation_code == TelnetNotificationHandler.RECEIVED_WILL)
287 {
288 command = "WILL";
289 }
290 else if(negotiation_code == TelnetNotificationHandler.RECEIVED_WONT)
291 {
292 command = "WONT";
293 }
294 System.out.println("Received " + command + " for option code " + option_code);
295 }
296
297 /***
298 * Reader thread.
299 * Reads lines from the TelnetClient and echoes them
300 * on the screen.
301 ***/
302 public void run()
303 {
304 InputStream instr = tc.getInputStream();
305
306 try
307 {
308 byte[] buff = new byte[1024];
309 int ret_read = 0;
310
311 do
312 {
313 ret_read = instr.read(buff);
314 if(ret_read > 0)
315 {
316 System.out.print(new String(buff, 0, ret_read));
317 }
318 }
319 while (ret_read >= 0);
320 }
321 catch (Exception e)
322 {
323 System.err.println("Exception while reading socket:" + e.getMessage());
324 }
325
326 try
327 {
328 tc.disconnect();
329 }
330 catch (Exception e)
331 {
332 System.err.println("Exception while closing telnet:" + e.getMessage());
333 }
334 }
335 }
336