Java Telnetclient는“계속하려면 모든 키를 누르십시오”에 매달려 있습니다.

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

  •  16-09-2019
  •  | 
  •  

문제

Linux와 Telnets에서 실행되는 Java 프로그램이 있습니다. org.apache.commons.net.telnet.TelnetClient 몇 가지 명령을 수행합니다. 문제는 출력 디스플레이에 도달 할 때 간헐적으로 매달린다는 것입니다. 사용자가 "계속하려면 모든 키를 누르도록… 서버 중 3 개만 문제가 있습니다. 또한 Windows 상자에서 동일한 프로그램을 실행하면 항상 작동합니다.

다른 사람이 이런 문제가 발생했는지 궁금합니다.

테스트 서버에서는 테스트 할 때마다 매달릴 수 있습니다. 나는 그것을 매달리지 않고 운이없는 다른 명령을 보내려고 노력했습니다. 나는 모든 Carrage 리턴, 라인 피드, 캐릭터를 추가하고 선 피드를 넣었습니다. 클라이언트를 계속 만드는 것은 없습니다.

버퍼를 플러시하는 것을 언급하는 것을 잊어 버렸습니다. 나는 플러시 명령을 어디서나 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.socketinputstream.read (socketinputstream.java:129)에서 java.net.socketinputstream.socketsread0 (기본 메소드)에서 시간을 읽습니다. : 218) java.io.bufferedInputStream.Read (bufferedInputStream.java:237) at java.io.filterinputStream.read (filterinputstream.java:66) at java.io. .apache.commons.net.io.fromnetasciiinputstream .__ at org.apache.commons.net.io.fromnetasciiinputstream.read (ournetasciiinputstream.java:175) at java.io.buperedinputestream.fill (bufferedinputstream.buferedinputestream.read) .java : 218) at java.io.bufferedInputStream.read (bufferedInputStream.java:237) at org.apache.commons.net.telnet.telnetinputstream .__ read (org.apache.commons.net. telnet.telnetInputStream.run (java.lang.thread.run (Thread.java:619)의 at atelnetInputStream.run (telnetInputStream.java:564)

매달린 곳 : 영어 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