【发布时间】:2012-04-15 02:10:48
【问题描述】:
我正在使用 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 输入流中读取而挂起。运行条件相同。为什么我会遇到这种情况? 如果有人有编写 cisco telnet 客户端的技巧,我会很高兴听到他们!
【问题讨论】:
-
使用
tcpdump或其他数据包嗅探器找出原因。从这一层代码无法判断。 -
你能更准确地描述这个问题吗?你是说你没有输出吗?或者你得到一些输出然后它挂起?还是什么?
-
我尝试过使用wireshark。它显示,我的路由器发送 telnet 数据(提示输入密码),但我的应用程序不响应此数据包。收到三重提示后(如果发生超时错误,则会发送新提示),我的应用程序会打印所有 3 个提示,然后是密码错误错误。我不明白什么时候会发生。可能是 telnet 选项中的情况?
-
read函数 ever 是否返回,但您再次调用它并阻塞?还是它永远不会返回一次? -
某些情况下read函数是否立即返回,并显示一个提示。在其他情况下,此函数会挂起一段时间(我认为是三重密码超时)然后返回,并显示 3 个提示,每个提示都有“超时”消息和密码错误错误。
标签: client apache-commons telnet cisco