0

我一直在尝试解决这个问题一段时间:

我已经设置了一个 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 序列。

4

1 回答 1

0

您是否嗅过实际发送的内容?我希望 Apache 代码能够逃脱 IAC,因此您实际上是在发送 IAC-IAC-EL。

您应该调用 TelnetClient.sendCommand(EL)。

于 2011-08-02T03:20:41.563 回答