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