1

Linux で実行されorg.apache.commons.net.telnet.TelnetClient、いくつかのコマンドを使用してリモート サーバーに telnet で接続する Java プログラムがあります。問題は、ユーザーに「続行するには任意のキーを押してください...」と要求する出力表示が表示されると、断続的にハングすることです。プログラムは、実行する 10 回ごとに約 1 回、実行する 7 台のサーバーのうち約 1 回でハングします。サーバーのうち3つだけに問題があります。また、Windows ボックスで同じプログラムを実行すると、常に動作します。

他の誰かがこのような問題に遭遇したかどうか疑問に思っていましたか?

テストサーバーでは、テストするたびにハングアップできます。ハングしない他のコマンドを送信しようとしましたが、うまくいきません。改行、改行、文字の追加、改行の入れ方はすべて試しました。クライアントを継続させるものはないようです。

私が最初に考えたバッファのフラッシュについて言及するのを忘れていました。フラッシュコマンドは、問題が発生する可能性があると思われる場所に配置しました。
また、実行して書き込み行からの出力を見ると、「任意のキーを押してください」が検出され、続行しますが、端末がハングして続行されないことにも言及します。

電話をかける場所のコード:

        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: java.net.SocketInputStream.socketRead0(Native Method) で読み取りタイムアウト:218) で java.io.BufferedInputStream.read(BufferedInputStream.java:237) で java.io.FilterInputStream.read(FilterInputStream.java:66) で java.io.PushbackInputStream.read(PushbackInputStream.java:122) で org .apache.commons.net.io.FromNetASCIIInputStream.__read(FromNetASCIIInputStream.java:77) at org.apache.commons.net.io.FromNetASCIIInputStream.read(FromNetASCIIInputStream.java:175) at java.io.BufferedInputStream.fill(BufferedInputStream) org.apache.commons.net.telnet.TelnetInputStream の java.io.BufferedInputStream.read(BufferedInputStream.java:237) の .java:218)。__read(TelnetInputStream.java:122) at org.apache.commons.net.telnet.TelnetInputStream.run(TelnetInputStream.java:564) at java.lang.Thread.run(Thread.java:619)

ハングする場所: 英語 1 6000 4462 26 % 13826 11056 20 %

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

何かキーを押すと続行します....

4

1 に答える 1

4

いくつかの理由が考えられます:

  1. 出力(リモートコマンドの入力)をフラッシュしていないため、「任意のキー」は送信されません。

  2. プログラムはデータを送信しようとしますが、入力 (リモート コマンドの出力) を読み取ることはありません。通常、I/O は「同時に」発生し、一方を適切なタイミングで処理しないと一方がブロックされるため、これは 2 番目のスレッドで行う必要があることに注意してください。

  3. アプリが端末を「RAWモード」にするため、問題が発生する可能性があります。ただし、出力をフラッシュすると修正されるはずです:/

于 2009-08-14T15:30:04.477 に答える