2016-02-09 9 views
33

Ich entwerfe eine Konsolenanwendung für einen Server, auf dem RedHat ausgeführt wird. Die Endbenutzer sollten diese App mit einem beliebigen Terminal ihrer Wahl ausführen können. (Zum Beispiel; Gnome Terminal, Putty SSH/Telnet, MS Telnet Client und andere).Festlegen der Umgebung für System.in

In den meisten Terminal-Anwendungen ist nichts falsch, aber wenn ich mein Programm von einer MS-Telnet-Sitzung starte, bemerke ich, dass meine speziellen Eingänge für System.in und System.console() völlig durcheinander geraten. Eine Rücktaste schreibt ^H auf den Bildschirm und andere Schlüssel schreiben auch Kauderwelsch.

Ich habe es genug gehackt, dass ich es konsequent bekommen zu arbeiten, aber ich bin sicher, was ich tue, ist gross:

if (!System.getenv("TERM").equals("xterm")) 
{ 
    System.out.println("\nWARNING: The TERM type is now set to xterm\n"); 
    final String[] cmd = { "/bin/sh", "-c", "export TERM=xterm" }; 
    Runtime.getRuntime().exec(cmd); 
} 

Gäbe es ein Problem sein, hier für Endgeräte, die don unterstützt nicht xterm? Ich merke, dass der Microsoft Telnet-Client es Ihnen nicht erlaubt, den -Typ auf xterm festzulegen, bevor Sie eine Sitzung beginnen. Sobald die Sitzung gestartet wird, scheint jedoch die Einstellung das Problem zu lösen.

Wie gehen die meisten Konsolenanwendungen mit diesem Problem um?

+0

Wahrscheinlich sind Ihre Kauderwelsch ansi Escape-Pässe http://stackoverflow.com/questions/16755142/how-to-make-win32-console-recognise-ansi-vt100-escape-sequences?lq=1 –

+2

suchen Sie dort : https://github.com/fusesource/jansi Jansi ist eine kleine Java-Bibliothek, die Sie ANSI-Escape-Sequenzen zu verwenden, ermöglicht die Konsole Ausgabe zu formatieren, die auch auf Windows funktioniert. –

+0

@AndreasFrische oh wow, das sieht vielversprechend aus! Ich muss damit herumspielen! – flakes

Antwort

1

Mit Charakter Terminal-Anwendungen, gibt es immer zwei Enden in der Kommunikation, die auf einigen müssen, wie die Steuerzeichen zu interpretieren. Normalerweise sind beide Seiten in der Lage, eine Vielzahl von Codierungen zu verwenden, die in der Datenbank termcap/terminfo beschrieben sind.

auf dem Unix-Server-seitige Sie die Codierung durch Einstellen der TERM Umgebungsvariable definieren können, oder durch Verwendung von stty (a Standard sonst verwendet wird, oft eine Dumb-Terminal-Emulation).

Auf der Client-Seite müssen Sie auch die gleiche Terminalemulation wie auf der Serverseite einstellen. Windows-natives Telnet hat die Fähigkeit, die Emulation zu definieren (siehe z. B. Configure the Telnet Terminal Type), ebenso wie andere Terminal-Emulatoren (z. B. Putty).

In Bezug auf Ihre Design-Entscheidungen: Die oben genannten Terminal-Einstellung sind in der Regel nur in der Benutzerdokumentation beschrieben und in der Anwendung nicht fest codiert, um mehr Flexibilität zu lassen. Schließlich wissen Sie nicht im Voraus, welches Terminal (nur ein einfaches Hardware-Terminal, das eine einzige Termbankcodierung unterstützt, vielleicht?) Ihre Benutzer verwenden werden.

(Da Ihre Frage wenig mit Java oder system.in zu tun hat, können Sie die verwendeten Tags erneut prüfen.)