我一直在尝试解决这个问题一段时间:
我已经设置了一个 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 序列。