我有一个在 Linux 上运行的 Java 程序,它使用 org.apache.commons.net.telnet.TelnetClient
远程登录到远程服务器并执行一些命令。问题是,当它到达要求用户“按任意键继续……”的输出显示时,它会间歇性地挂起。该程序每运行 10 次,在我运行它的 7 台服务器中,大约有 1 次挂起只有 3 台服务器有问题。此外,当我在 Windows 框上运行相同的程序时,它一直有效。
不知道有没有人遇到过这样的问题?
在测试服务器上,我每次都可以让它挂起进行测试。我尝试发送其他不会导致它挂起的命令,但没有成功。我已经尝试了所有的回车、换行、添加字符和换行。似乎没有什么能让客户端继续。
忘了说我第一个想到的是刷新缓冲区。我将 flush 命令放在我认为可能有用的任何地方。
我还会提到,当我运行它并观察写入行的输出时,它确实找到了“按任意键”并继续运行但挂起终端不会继续。
我调用的代码:
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 方法) 在 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) 在 org.apache.commons.net.io.FromNetASCIIInputStream.__read(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) 在 org.apache.commons.net.telnet.TelnetInputStream.__read(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
按任意键继续....
最佳答案
可能有以下几个原因:
您没有刷新输出(远程命令的输入),因此永远不会发送“任意键”。
该程序试图向您发送一些数据,但您永远不会读取您的输入(远程命令的输出)。请注意,您必须在第二个线程中执行此操作,因为 I/O 通常“同时”发生,如果您没有及时处理另一端,则一侧会阻塞。
您可能遇到了问题,因为应用程序将终端转为“RAW 模式”。但是刷新你的输出应该可以解决这个问题:/
关于Java TelnetClient 在 “press any key to continue” 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1278364/