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