Domanda

Ho un programma Java che gira su Linux e telnets in un server remoto utilizzando org.apache.commons.net.telnet.TelnetClient ed esegue alcuni comandi. Il problema è che si blocca a intermittenza quando si arriva a un display di uscita che chiede agli utenti di “premere un tasto qualsiasi per continuare ...” Il programma si blocca su questo circa 1 ogni 10 tims Corre e fuori dei 7 assistenti l'eseguo on solo 3 dei server hanno problemi. Inoltre, quando si esegue lo stesso programma su una macchina Windows che funziona per tutto il tempo.

Mi chiedevo se qualcun altro ha riscontrato un problema come questo?

Su un server di test posso farlo per appendere ogni volta alla prova con. Ho cercato di inviare altri comandi che non provocano la sua sospensione, ma senza fortuna. Ho provato tutto il ritorno carrage, avanzamento riga, aggiungendo un carattere e mettere in un avanzamento riga. Nulla sembra renderlo client continuare.

dimenticato di dire che il lavaggio del buffer di ciò che la prima cosa che ho pensato. Ho messo il comando a filo da nessuna parte ho pensato che potrebbe hlep.
Vorrei anche ricordare che quando l'eseguo e guardo l'uscita dalla linea di scrittura esso trovare il "premere un tasto qualsiasi" e continua ad andare, ma si blocca il terminale non continuare.

codice dove ho effettuare la chiamata:

        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: Leggi scaduta     a java.net.SocketInputStream.socketRead0 (metodo natale)     a java.net.SocketInputStream.read (SocketInputStream.java:129)     a java.io.BufferedInputStream.fill (BufferedInputStream.java:218)     a java.io.BufferedInputStream.read (BufferedInputStream.java:237)     a java.io.FilterInputStream.read (FilterInputStream.java:66)     a java.io.PushbackInputStream.read (PushbackInputStream.java:122)     a org.apache.commons.net.io.FromNetASCIIInputStream .__ lettura (FromNetASCIIInputStream.java:77)     a org.apache.commons.net.io.FromNetASCIIInputStream.read (FromNetASCIIInputStream.java:175)     a java.io.BufferedInputStream.fill (BufferedInputStream.java:218)     a java.io.BufferedInputStream.read (BufferedInputStream.java:237)     a org.apache.commons.net.telnet.TelnetInputStream .__ lettura (TelnetInputStream.java:122)     a org.apache.commons.net.telnet.TelnetInputStream.run (TelnetInputStream.java:564)     a java.lang.Thread.run (Thread.java:619)

DOVE SI blocca:            inglese 1 6000 4462 26% 13826 11056 20%

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

Premere un tasto qualsiasi per continuare ....

È stato utile?

Soluzione

Ci possono essere diverse ragioni:

  1. Non sei vampate di calore l'output (l'ingresso del comando remoto), in modo che il "any key" non vengono mai inviate.

  2. Il programma tenta di inviare alcuni dati e non avete mai letto il vostro input (l'output del comando a distanza). Si noti che è necessario farlo in un secondo thread in quanto l'I / O di solito accade "allo stesso tempo" e un lato si blocca se non si gestisce dall'altra parte abbastanza puntuale.

  3. Forse si verifica un problema, perché l'applicazione trasforma il terminale in modalità "RAW". Ma vampate di calore l'output dovrebbe risolvere che: /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top