我一直试图想出这个问题一段时间了:
我已经建立了一个apache commons telnet客户端,可以将命令发送到服务器并读取响应。我的程序基本上是这样的:
TelnetClient telnetClient = new TelnetClient();
// Add option handlers
TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler(
"VT100", false, false, true, false);
EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true,
false);
SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true,
true, true);
try {
telnetClient.addOptionHandler(ttopt);
telnetClient.addOptionHandler(echoopt);
telnetClient.addOptionHandler(gaopt);
} catch (InvalidTelnetOptionException e) {
System.err.println("Error registering option handlers: "
+ e.getMessage());
throw new IOException();
}
// Connect to server
telnetClient.connect(SERVER_ADDRESS, SERVER_PORT);
byte[] data = new byte[] { 'f', 'o', 'o', '\r', '\n' };
// Send "foo"
telnetClient.getOutputStream().write(data);
telnetClient.getOutputStream().flush();
// ...
// Erase previous input
data = new byte[] { (byte) TelnetCommand.IAC, (byte) TelnetCommand.EL,
'\r', '\n' };
telnetClient.getOutputStream().write(data);
telnetClient.getOutputStream().flush();
我要做的是发送一个telnet EL命令来擦除以前发送的整行字符(“foo”)。 Telnet命令总是与前面的IAC字符一起发送,这也是我发送的内容。
我有一个监听器的工作实现,它读取服务器的回声并打印出来。
问题是当我发送IAC-EL时,字符不会被解释为命令。而是将IAC-EL字符作为“foo ø”回显到前一个输入。
这可能是线模式一次设置为一个字符的问题吗?
服务器端也通过telnet运行VT100。也许有一些方法可以发送VT100转义序列来代替擦除行,例如“←[1K”。无论如何,我都没有成功发送VT100序列。
答案 0 :(得分:0)
你嗅到了实际发送的内容吗?我希望Apache代码能够逃脱IAC,所以你真的要发送IAC-IAC-EL。
您应该调用TelnetClient.sendCommand(EL)。