Java TelnetClient معلقة في "اضغط على أي مفتاح للمتابعة"

StackOverflow https://stackoverflow.com/questions/1278364

  •  16-09-2019
  •  | 
  •  

سؤال

لدي برنامج Java يعمل على Linux و Telnets في خادم بعيد باستخدام org.apache.commons.net.telnet.TelnetClient ويؤدي بعض الأوامر. المشكلة هي أنه يتم تعليقها بشكل متقطع عندما يحصل على عرض إخراج يطلب من المستخدمين "الضغط على أي مفتاح متابعة ..." يتم تعليق البرنامج على هذا حوالي 1 من كل 10 تيمين يتم تشغيله وخارج الخوادم 7 التي أجريها على 3 فقط من الخوادم لها مشاكل. أيضا، عندما أقوم بتشغيل نفس البرنامج على مربع Windows يعمل طوال الوقت.

كنت أتساءل ما إذا واجه أي شخص آخر مشكلة مثل هذا؟

في خادم اختبار يمكنني الحصول عليه للشنق في كل مرة لاختبار معها. لقد حاولت إرسال أوامر أخرى لن تتسبب في تعليقها ولكن لا حظ. لقد جربت كل عودة الكفاج، تغذية الخط، مضيفا حرفا ووضعها في تغذية سطر. لا شيء يبدو أنه يجعله عميل يستمر.

نسيت أن أذكر أن مسح المخزن المؤقت ما هو أول شيء اعتقدت عليه. وضعت أمر فلوش في أي مكان اعتقدت أنه قد يكون hlep.
سأذكر أيضا أنه عندما أقوم بتشغيله ومشاهدة الإخراج من سطر الكتابة، فهو يجد "اضغط على أي مفتاح" ويحافظ على الذهاب ولكن معلقة الطرف لا يستمر.

الرمز حيث أقوم بإجراء المكالمة:

        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.sockettinputstream.socketread0 (الطريقة الأصلية) في java.net.sockettinputstream.read (socketenputstream.java:129) في java.io.bufferedinputstream.fill (bufferedinputstream.java . .apache.commons.net.io.fromnetasciiienputstream .java: 218) في java.io.bufferedinputstream.read (BufferedInputstream.java:237) 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)

حيث توقف: الإنجليزية 1 6000 4462 26٪ 13826 11056 20٪

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

اضغط على أى زر للاستمرار....

هل كانت مفيدة؟

المحلول

قد يكون هناك عدة أسباب:

  1. أنت لا تقوم بتخفيف إخراجك (إدخال الأمر البعيد)، بحيث لا يتم إرسال "أي مفتاح" أبدا.

  2. يحاول البرنامج إرسال بعض البيانات ولم تقرأ إدخالك أبدا (إخراج الأمر البعيد). لاحظ أنه يجب عليك القيام بذلك في مؤشر ترابط آخر نظرا لأن I / O يحدث عادة "في نفس الوقت"، وسيتم حظر جانب واحد إذا كنت لا تتعامل مع الجانب الآخر في الوقت المناسب بما فيه الكفاية.

  3. ربما تواجه مشكلة لأن التطبيق يحول الطرف إلى "الوضع الخام". لكن مسح الإخراج الخاص بك يجب إصلاح ذلك: /

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top