【问题标题】:How do I send telnet erase line (EL) with Java Apache commons?如何使用 Java Apache commons 发送 telnet 擦除行 (EL)?
【发布时间】:2011-10-17 14:06:35
【问题描述】:

我一直在努力解决这个问题:

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

【问题讨论】:

    标签: java telnet apache-commons-net


    【解决方案1】:

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

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

    【讨论】:

    • 我对发送的数据包进行了嗅探,您是对的,它实际上转义了 IAC 字符,因此发送了 IAC-IAC-EL。但是,如果我尝试仅发送 EL,则嗅探器会显示它仅自行发送 EL(无 IAC)。我如何设法只发送一个 IAC 后跟一个 EL 字符?
    • @snipes83 我刚才不是回答了吗?
    • 我发送命令的方法会很棒,但我找不到。 TelnetClient 类只有“sendAYT()”用于发送“你在吗”命令。我查看了 sendAYT 方法的源代码,它似乎将此字节数组写入输出流: static final byte[] _COMMAND_AYT = { (byte) TelnetCommand.IAC, (byte) TelnetCommand.AYT };为什么 IAC 没有逃脱?我猜是特殊处理。
    • 我找不到你指的方法。我正在使用 commons-net v2.2
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2012-12-11
    • 2013-01-01
    • 2016-01-15
    • 2010-10-25
    相关资源
    最近更新 更多