我正在使用apache.commons.net.telnet为cisco路由器编写telnet客户端。但我有问题。以下是代码示例:
static TelnetClient telnetClient = new TelnetClient();
public static void main(String[] args) throws IOException {
setOptionHandlers();
telnetClient.connect("192.168.127.100");
read();
telnetClient.disconnect();
}
private static void setOptionHandlers() throws IOException {
ArrayList<TelnetOptionHandler> optionHandlers =
new ArrayList<TelnetOptionHandler>();
optionHandlers.add(new TerminalTypeOptionHandler("VT100", false, false, true, false));
optionHandlers.add(new EchoOptionHandler(true, false, true, false));
optionHandlers.add(new SuppressGAOptionHandler(true, true, true, true));
for (TelnetOptionHandler handler : optionHandlers) {
try {
telnetClient.addOptionHandler(handler);
}
catch (InvalidTelnetOptionException e) {
System.err.println("Error registering option handler "
+ handler.getClass().getSimpleName());
}
}
}
public static void write(byte[] data) throws IOException {
telnetClient.getOutputStream().write(data);
telnetClient.getOutputStream().flush();
}
public static void read() throws IOException {
System.out.println("Read");
byte[] buff = new byte[1024];
int read;
if((read = telnetClient.getInputStream().read(buff)) > 0) {
System.out.println(new String(buff, 0, read));
}
System.out.println("read="+read);
}
在某些情况下,它可以正常工作,并显示输入密码的提示。但在其他情况下,它工作不正确——通过从telnet输入流读取挂起。运行条件相同。为什么我会遇到这种情况?如果有人有编写ciscotelnet客户端的技巧,我会很高兴听到的!
我每次都可以重现这个问题。
这个问题可以通过将读取缓冲区大小更改为1字节来解决。
这解释了为什么Looking for Java Telnet模拟器中的readUntil()函数可以工作,它只需为1个字节调用read()。
也就是说,这是否表明org.apache.commons.net.TelnetClient中存在错误?
编辑:回滚到CommonsNet的早期版本,问题消失了!