Question

J'ai un programme Java qui fonctionne sur Linux et telnets dans un serveur distant en utilisant org.apache.commons.net.telnet.TelnetClient et exécute quelques commandes. Le problème est qu'il se bloque par intermittence quand il arrive à un affichage de sortie qui demande aux utilisateurs de « appuyer sur une touche pour continuer ... » Le programme se bloque sur ce environ 1 sur 10 TIMS il exécute et des 7 serveurs je le lance sur seulement 3 des serveurs ont des problèmes. Aussi, quand je lance le même programme sur une boîte de Windows, il fonctionne tout le temps.

Je me demandais si quelqu'un d'autre a rencontré un problème comme celui-ci?

Sur un serveur de test, je peux l'obtenir pour accrocher chaque fois pour tester avec. J'ai essayé d'envoyer d'autres commandes qui ne causeront pas pendre, mais pas de chance. J'ai essayé tout le retour de carrage, saut de ligne, en ajoutant un caractère et mettre dans un saut de ligne. Rien ne semble faire continuer client.

J'ai oublié de mentionner que le tampon de rinçage ce que la première chose que je pensais. Je mets la commande affleurant partout où je pensais qu'il pourrait hlep.
Je vais aussi mentionner que quand je le lance et regarder la sortie de la ligne d'écriture, il ne trouve la « appuyez sur une touche » et continue à aller, mais bloque le terminal ne continue pas.

CODE OÙ JE FAIS APPEL:

        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: Lire a expiré     à java.net.SocketInputStream.socketRead0 (Méthode natif)     à java.net.SocketInputStream.read (SocketInputStream.java:129)     à java.io.BufferedInputStream.fill (BufferedInputStream.java:218)     à java.io.BufferedInputStream.read (BufferedInputStream.java:237)     à java.io.FilterInputStream.read (FilterInputStream.java:66)     à java.io.PushbackInputStream.read (PushbackInputStream.java:122)     à lire org.apache.commons.net.io.FromNetASCIIInputStream .__ (FromNetASCIIInputStream.java:77)     à org.apache.commons.net.io.FromNetASCIIInputStream.read (FromNetASCIIInputStream.java:175)     à java.io.BufferedInputStream.fill (BufferedInputStream.java:218)     à java.io.BufferedInputStream.read (BufferedInputStream.java:237)     à lire org.apache.commons.net.telnet.TelnetInputStream .__ (TelnetInputStream.java:122)     à org.apache.commons.net.telnet.TelnetInputStream.run (TelnetInputStream.java:564)     à java.lang.Thread.run (Thread.java:619)

OÙ IL ACCROCHE:            anglais 1 6000 4462 26% 13826 11056 20%

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

Appuyez sur une touche pour continuer ....

Était-ce utile?

La solution

Il pourrait y avoir plusieurs raisons:

  1. Vous n'êtes pas rinçage de votre sortie (l'entrée de la commande à distance), de sorte que la « toute clé » est jamais envoyé.

  2. Le programme essaie de vous envoyer des données et vous jamais lu votre entrée (la sortie de la commande à distance). Notez que vous devez faire dans un deuxième fil depuis le I / O se produit généralement « en même temps » et un côté bloque si vous ne manipulez pas l'autre côté assez rapide.

  3. Peut-être que vous rencontrez un problème parce que l'application transforme le terminal en mode « RAW ». Mais rinçage de votre sortie doit résoudre ce problème: /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top