Pregunta

Tengo un programa Java que se ejecuta en Linux y telnet en un servidor remoto utilizando org.apache.commons.net.telnet.TelnetClient y realiza algunos comandos. El problema es que se cuelga de forma intermitente cuando se llega a una pantalla de salida que pide a los usuarios a “presionar cualquier tecla para continuar ...” El programa se cuelga en este aproximadamente 1 de cada 10 timas se ejecuta y fuera de los 7 servidores funciono en sólo 3 de los servidores tienen problemas. Además, cuando corro el mismo programa en una caja de ventanas funciona todo el tiempo.

Me preguntaba si alguien más ha encontrado un problema como este?

En un servidor de prueba que puedo conseguir que se bloquee cada vez que probar con. He intentado enviar en otros comandos que no causarán que cuelgue pero no hubo suerte. He tratado toda la vuelta carrage, avance de línea, añadiendo un carácter y poniendo en un avance de línea. Nada parece que sea cliente de continuar.

olvidó mencionar que vaciar el búfer lo que lo primero que pensé. Pongo el comando ras en cualquier lugar que pensé que podría hlep.
También voy a mencionar que al ejecutarlo y ver la salida de la línea de escritura que no encontrar el "pulse cualquier tecla" y sigue adelante, pero se cuelga el terminal no continuar.

CÓDIGO donde hago la llamada:

        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: Leer tiempo de espera     en java.net.SocketInputStream.socketRead0 (Nativo Método)     en java.net.SocketInputStream.read (SocketInputStream.java:129)     en java.io.BufferedInputStream.fill (BufferedInputStream.java:218)     en java.io.BufferedInputStream.read (BufferedInputStream.java:237)     en java.io.FilterInputStream.read (FilterInputStream.java:66)     en java.io.PushbackInputStream.read (PushbackInputStream.java:122)     en org.apache.commons.net.io.FromNetASCIIInputStream .__ leer (FromNetASCIIInputStream.java:77)     en org.apache.commons.net.io.FromNetASCIIInputStream.read (FromNetASCIIInputStream.java:175)     en java.io.BufferedInputStream.fill (BufferedInputStream.java:218)     en java.io.BufferedInputStream.read (BufferedInputStream.java:237)     en org.apache.commons.net.telnet.TelnetInputStream .__ leer (TelnetInputStream.java:122)     en org.apache.commons.net.telnet.TelnetInputStream.run (TelnetInputStream.java:564)     en java.lang.Thread.run (Thread.java:619)

donde se cuelga:            Inglés 1 6000 4462 26% 13 826 11 056 20%

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

Pulse cualquier tecla para continuar ....

¿Fue útil?

Solución

Puede haber varias razones:

  1. Usted no es el lavado de su salida (la entrada del comando a distancia), por lo que el "cualquier tecla" nunca se envía.

  2. El programa intenta enviarle algunos datos y nunca leer su entrada (la salida del comando a distancia). Tenga en cuenta que debe hacer esto en un segundo hilo ya que la E / S por lo general ocurre "al mismo tiempo" y un lado bloqueará si no se controla el otro lado lo suficientemente a tiempo.

  3. Tal vez se le presenta un problema porque la aplicación convierte el terminal en modo "RAW". Sin embargo, el lavado de su salida debe arreglar eso: /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top