2011-11-14 3 views
2

私はかなり生である。私は、Telnetと対話するJavaクラスを作成しようとしています。 Apache CommonsとJsacpeにAPIがあることがわかりました。私はJscapeのSinetfactoryを使用しています。私が接続しようとしているTelnetは、telnet.connect()が発生するとすぐに「User name ?:」と入力するよう促します。私はこのプロンプトが実際に起こっていることを確認する必要がありますので、何か他のことが起こったときに答えを書くだけではありません。私はこれを経験しておらず、簡単な答えがあると確信しています。Java、Telnet、InputStreamで文字列をチェックする

これは私が持っているものです。ストリームから最後の文字を実際に読み取る方法がわからないからです。

import com.jscape.inet.telnet.*; 

public class TelnetTest extends TelnetAdapter { 

    private final static String USER = "xxx\r"; 
    private final static String PWORD = "yyy\r"; 
    private final static String COMMAND = "zzz\r"; 
    private final static byte[] USER_BYTE = USER.getBytes(); 
    private final static byte[] PWORD_BYTE = PWORD.getBytes(); 
    private final static byte[] COMMAND_BYTE = COMMAND.getBytes(); 
    private Telnet telnet = null; 
    private OutputStream output = null; 
    private static BufferedReader reader = null; 
    private boolean connected = false; 
    private String hostname = "qqq"; 
    //TelnetInputStream tis = null; NOT IN USE AS OF NOW 

    public TelnetTest() throws IOException, TelnetException { 

     // create new Telnet instance 
     telnet = new Telnet(hostname); 

     // register this class as TelnetListener 
     telnet.addTelnetListener(this); 

     // establish Telnet connection 
     telnet.connect(); 
     connected = true; 
     output = telnet.getOutputStream(); 

// HERE IS WHERE I NEED HELP, NOT SURE HOW TO CHECK STREAM 
     String str = null; 
     if ((str = reader.readline()).equals("User name?:")) { 
      telnet.getOutputStream().write(USER_BYTE); 
     } 
// SAME CHECK WOULD HAPPEN HERE FOR "Password" 
     telnet.getOutputStream().write(PWORD_BYTE); 
// ANOTHER SIMILAR CHECK HERE 
     telnet.getOutputStream().write(COMMAND_BYTE); 

     // sends all data entered at console to Telnet server 
     String input = null; 
     while ((input = reader.readLine()) != null) { 
      if (connected) { 
       ((TelnetOutputStream) output).println(input); 
      } else { 
       break; 
      } 
     } 
    } 

    public boolean streamContainsString(Reader reader, String searchString) 
      throws IOException { 
     Scanner streamScanner = new Scanner(reader); 
     if (streamScanner.findWithinHorizon(searchString, 0) != null) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    // Invoked when Telnet socked is connected. 
    public void connected(TelnetConnectedEvent event) { 
     System.out.println("Connected"); 
    } 

    // Invoked when Telnet socket is disconnected. Disconnect can 
    public void disconnected(TelnetDisconnectedEvent event) { 
     connected = false; 
     System.out.print("Disconnected. Press enter key to quit."); 
    } 

    // Invoked when Telnet server requests that the Telnet client begin performing    specified TelnetOption. 
    public void doOption(DoOptionEvent event) { 
     // refuse any options requested by Telnet server 
     telnet.sendWontOption(event.getOption()); 
    } 

    // Invoked when Telnet server offers to begin performing specified TelnetOption. 
    public void willOption(WillOptionEvent event) { 
     // refuse any options offered by Telnet server 
     telnet.sendDontOption(event.getOption()); 
    } 

    // Invoked when data is received from Telnet server. 
    public void dataReceived(TelnetDataReceivedEvent event) { 
     // print data recevied from Telnet server to console 
     System.out.print(event.getData()); 
    } 

    public Telnet getTelnet() { 
     return telnet; 
    } 

    // starts console program 
    public static void main(String[] args) { 
     try { 
      // create BufferedReader to read data from console 
      reader = new BufferedReader(new InputStreamReader(System.in)); 

      // create new TelnetExample instance 
      TelnetTest example = new TelnetTest(); 

     } catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 
    } 
} 
+0

私はあなたが何を意味するか理解しない「このプロンプトが実際に起こっていることを確認してください。」接続後にユーザ名を表示したり、ユーザが何も入力しなかったのを確認したりしますか? –

+0

私は、telnetが実際に "ユーザ名?"、 "パスワード:"、 "ComputerName:/ h0>"を要求していることを確認しています。これは可能ではありませんが、良い習慣であるようで、物事があまりにもゆっくりと動き、コードがそれをチェックするまでにプロンプ​​トが流れていなければ、sleep()を避けるのに役立ちます。それは理にかなっていますか? –

+0

私の答えは、まったく役に立ちました@MikeNickですか?もしそうなら、受け入れてください。 – Gray

答えて

4

あなたは、あなたが常にReaderWriterを使用する必要がある文字列を書いて/読んでいる場合。 BufferedReaderは、ライン操作を行うことができます。だから、(InputStreamReader周り)Readerに巻き付けBufferedReaderでは、接続からの入力の行を取得するにはreadLine()呼び出しを行うことができます:

BufferedReader reader = 
    new BufferedReader(new InputStreamReader(telnet.getInputStream())); 

あなたはOutputStreamWriter周りWriterを使用する接続に書き込みを:

Writer writer = new OutputStreamWriter(telnet.getOutputStream())); 

私はそれがTelnetからの流れで動作するかどうかはわからないが、それは生Socketで動作します。その後、次の擬似コードのような何かができる:

while (true) { 
    read a line from the server 
    some sort of if/then/else to test for the output 
    write your username/password or whatever is appropriate for the connection 
    repeat until some logout or IOException... 
} 

アパッチTelnetクラスは、あなたがしたかったのですが、学習曲線は以上であってもよい場合は、使用することができ、興味深いリスナーと他のハンドラの数を持っています。ここでTelnetClientを使用して優れたサンプルアプリケーションです:

http://www.java2s.com/Code/Java/Network-Protocol/ExampleofuseofTelnetClient.htm

関連する問題