如何使用Java Apache commons发送telnet擦除行(EL)?

时间:2011-08-01 16:05:10

标签: java telnet apache-commons-net

我一直试图想出这个问题一段时间了:

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

1 个答案:

答案 0 :(得分:0)

你嗅到了实际发送的内容吗?我希望Apache代码能够逃脱IAC,所以你真的要发送IAC-IAC-EL。

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