如何在Java Telnet客户端中发送直接光标位置寻址?

时间:2015-02-25 07:40:49

标签: java telnet

我在java中使用apache.commons.net jar作为我的telnet客户端。我已尝试ESC[{ROW};{COLUMN}HESC[{ROW};{COLUMN}f进行直接光标寻址,但它没有用,有没有其他方法可以做到这一点,我在这里遗漏了什么? 注意:我正在使用this示例

进行测试

1 个答案:

答案 0 :(得分:0)

在java中,您可以使用文字字符27。所以,它看起来像这样(可能 - 至少这是我能想到的最佳方式):

class test {
    public static void main(String[] args) {
        System.out.print((char)27 + "c"); // clear the screen
        System.out.print((char)27 + "[H at top");
        System.out.flush(); // I would call this just to be safe (esp. if in a loop)
        System.out.print((char)27 + "[3;4H row 3; col 4");
        System.out.flush(); // I would call this just to be safe (esp. if in a loop)
        System.out.println(); // just so that the shell prompt is on the next line
    }
}

基本上,(char)27转换为转义字符(显然是27),但还有另一种方法可以做到这一点。如果您在Unix中并且可以运行vivim(或emacsed:D,或者终端中的任何编辑器(我猜),您可以编辑文件,在insert模式下,您可以按 ctrl v ctrl [。这将显示为^[一个字符,转义字符27 。这实质上迫使java将其解释为一个字符,因此它与(char)27的工作方式相同。

这对于不解释多字节字符的shell(例如sh)特别有用(我猜)。在sh中,您可以使用相同的过程来强制执行ansi转义序列(通过执行printf " ctrl v ctrl [ [3;4H bla"; - 这显示为printf "^[[3;4 bla"; ,例如因为printf "\e[3;4 bla";printf "\033[3;4 bla";或{{1}只是在printf "\x1b[3;4 bla";中工作,因为sh是一个字符,然后是一个或多个字符。)