2009-08-14 17 views
1

Ich habe ein Java-Programm, das auf Linux und Telnets auf einem Remote-Server mit org.apache.commons.net.telnet.TelnetClient läuft und ein paar Befehle ausführt. Das Problem ist, dass es zeitweise hängen bleibt, wenn es zu einer Ausgabeanzeige kommt, die die Benutzer bittet, irgendeine Taste zu drücken, um fortzufahren. Das Programm hängt davon etwa 1 von 10 laufenden und von den 7 Servern, auf denen es läuft auf nur 3 der Server haben Probleme. Auch wenn ich das gleiche Programm auf einer Windows-Box laufe, funktioniert es die ganze Zeit.Java TelnetClient hängt bei "drücken Sie eine beliebige Taste, um fortzufahren"

Ich fragte mich, ob jemand anderes ein Problem wie dieses gefunden hat?

Auf einem Test-Server kann ich es jedes Mal hängen, um zu testen. Ich habe versucht, andere Befehle zu senden, die es nicht hängen lassen, aber kein Glück. Ich habe alle Carrage Return, Line Feed, einen Charakter und einen Zeilenvorschub versucht. Nichts scheint den Client weitermachen zu lassen.

Vergessen zu erwähnen, dass das Spülen des Puffers, was das erste, woran ich dachte. Ich habe den Flush-Befehl irgendwo hingelegt, von dem ich dachte, dass er es könnte.
Ich werde auch erwähnen, dass, wenn ich es laufen und sehen Sie die Ausgabe von der Schreibleitung es findet "drücken Sie eine beliebige Taste" und macht weiter, aber hängt das Terminal nicht weiter.

CODE, wo ich den Anruf:

 readUntil("X) Exit (no report)"); 
     write("C", false); 
     out.flush(); 

     readUntil("continue...."); 

     // write this for all servers. 
     write("", true); 
     out.flush(); 

     readUntil("X) Exit"); 
     write("X", false); 


/* 
* This method is used to read the command line until the pattern that was 
* passed in is found. 
*/ 
public String readUntil(String pattern) throws Exception { 
    try { 
     String tempString; 
     char lastChar = pattern.charAt(pattern.length() - 1); 
     StringBuffer sb = new StringBuffer(); 
     //boolean found = false; 
     char ch = (char) in.read(); 
     while (true) 
     { 
      // NOTE: Turn line below on to watch the program perform the telnet 
      System.out.print(ch); 

      sb.append(ch); 
      tempString = sb.toString(); 
      if (ch == lastChar) { 
       if (tempString.endsWith(pattern)) 
       { 
        // log to file 
        logFileWriter.write(tempString); 
        logFileWriter.flush(); 
        return tempString; 
       } 
      } 
      ch = (char) in.read(); 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     throw e; 
    } 
} 

/* 
* writes the String passed in to the command line. 
* boolean userWriteln: true - use the return key after the command, false - just type the 
* command with NO enter key 
*/ 
public void write(String value, boolean useWriteln) 
{ 

    System.out.println("WRITTING '" + value + "'"); 

    try { 
     if (useWriteln) 
     { 
      out.println(value); 
     } 
     else 
     { 
      out.print(value); 
     } 
     out.flush(); 
     System.out.println(value); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Stacktrace: java.net.SocketTimeoutException: Read timed out bei java.net.SocketInputStream.socketRead0 (Mutter Methode) bei java.net.SocketInputStream. lese (SocketInputStream.java:129) bei java.io.BufferedInputStream.fill (BufferedInputStream.java:218) bei java.io.BufferedInputStream.read (BufferedInputStream.java:237) bei java.io.FilterInputStream.read (FilterInputStream.java:66) bei java.io.PushbackInputStream.read (PushbackInputStream.java:12 2) bei org.apache.commons.net.io.FromNetASCIIInputStream .__ lesen (FromNetASCIIInputStream.java:77) bei org.apache.commons.net.io.FromNetASCIIInputStream.read (FromNetASCIIInputStream.java:175) bei Java. io.BufferedInputStream.fill (BufferedInputStream.java:218) bei java.io.BufferedInputStream.read (BufferedInputStream.java:237) bei org.apache.commons.net.telnet.TelnetInputStream .__ lesen (TelnetInputStream.java:122) bei org.apache.commons.net.telnet.TelnetInputStream.run (TelnetInputStream.java:564) bei java.lang.Thread.run (Thread.java:619)

WHERE hängt sie: Englisch 1 6000 4462 26% 13826 11056 20%

Calls answered since Thu Jun 4, 2009 3:11 am: 41245 

Drücken Sie eine beliebige Taste, um fortzufahren ....

+0

Verwenden Sie gepufferteStreams? Vielleicht müssen einige anrufen .flush, um sicherzustellen, dass Ihre Charaktere tatsächlich sofort übertragen werden? – jsight

+0

Können Sie ein Fragment Ihres Quellcodes dort veröffentlichen, wo Sie die Befehle absetzen, die zum Hängen des Servers führen? – ChssPly76

+0

Wenn Ihre App hängt, haben Sie versucht, einen Stack-Trace zu erhalten (z. B. durch Senden eines Kill-QUIT-Signals)? – Adamski

Antwort

4

Es könnte mehrere Gründe haben:

  1. Sie sind nicht Ihre Ausgabe (die Eingabe des Remote-Befehl) Spülung, so Der "beliebige Schlüssel" wird niemals gesendet.

  2. Das Programm versucht, Ihnen einige Daten zu senden, und Sie lesen nie Ihre Eingabe (die Ausgabe des Remote-Befehls). Beachten Sie, dass Sie dies in einem zweiten Thread tun müssen, da die E/A normalerweise "zur gleichen Zeit" geschieht und eine Seite blockiert, wenn Sie die andere Seite nicht rechtzeitig genug behandeln.

  3. Vielleicht haben Sie ein Problem, weil die App das Terminal in "RAW-Modus" verwandelt. Aber das Löschen der Ausgabe sollte das beheben:/

+0

Ich habe beide angeschaut und spüle meinen Puffer. (oft und an vielen Orten). Ich suchte auch nach zusätzlichen Text, sah aber keine. – Ben

Verwandte Themen