Pergunta

Eu tenho um programa Java que roda em Linux e telnets em um servidor remoto usando org.apache.commons.net.telnet.TelnetClient e executa alguns comandos. O problema é que ele trava intermitentemente quando chega a um monitor de saída que pede aos usuários “pressione qualquer tecla para continuar ...” O programa paralisa nesta Cerca de 1 em cada 10 tims é executado e fora dos 7 servidores eu executá-lo em apenas 3 dos servidores têm problemas. Além disso, quando eu executar o mesmo programa em um Windows caixa trabalha o tempo todo.

Eu queria saber se alguém já encontrou um problema como este?

Em um servidor de teste que eu possa obtê-lo para pendurar a cada hora de teste com. Tentei enviar outros comandos que não irá causar-lo para pendurar mas sem sorte. Eu tentei tudo o retorno carrage, alimentação de linha, adicionando um personagem e colocar em um avanço de linha. Nada parece torná-lo cliente continuar.

esqueci de mencionar que liberar o buffer que a primeira coisa que eu pensei de. Eu coloquei o comando de descarga em qualquer lugar eu pensei que poderia hlep.
I também mencionar que quando eu executá-lo e observar a saída da linha de escrita que faz encontrar o "pressione qualquer tecla" e continua indo, mas trava o terminal não continuar.

código onde eu fazer a chamada:

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

onde pendura: Inglês 1 6000 4462 26% 13826 11056 20%

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

Pressione qualquer tecla para continuar ....

Foi útil?

Solução

Pode haver várias razões:

  1. Você não está liberando sua saída (a entrada do comando remoto), de modo a "qualquer tecla" nunca é enviada.

  2. tenta o programa para lhe enviar alguns dados e você nunca li sua entrada (a saída do comando remoto). Observe que você deve fazer isso em um segundo segmento desde a I / O normalmente acontece "ao mesmo tempo" e um lado vai bloquear se você não lidar com o outro lado oportuna suficiente.

  3. Talvez você tiver um problema porque o aplicativo transforma o terminal em "modo RAW". Mas nivelar sua saída deve corrigir isso: /

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top