2016-02-09 13 views
33

Projektuję aplikację konsolową dla serwera z systemem RedHat. Użytkownicy końcowi powinni mieć możliwość uruchamiania tej aplikacji z dowolnym wybranym przez siebie terminalem. (Na przykład: Terminal Gnome, Putty SSH/Telnet, klient MS Telnet i inne).Ustawianie środowiska dla System.in

W większości aplikacji terminalowych nie ma nic złego, jednak kiedy uruchamiam mój program z sesji MS Telnet, zauważam, że moje specjalne dane wejściowe dla System.in i System.console() są całkowicie pomieszane. Backspace napisze ^H na ekranie, a inne klawisze również bekną.

mam posiekany na niego tyle, że mogę dostać to, aby konsekwentnie działać, ale jestem pewien, że to, co robię jest brutto:

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); 
} 

Czy istnieje problem tutaj na terminalach, które don wspierasz xterm? Zauważyłem, że klient Microsoft Telnet nie zezwala na ustawienie typu TERM na xterm przed rozpoczęciem sesji. Jednak po uruchomieniu sesji wydaje się, że ustawienie TERM=xterm rozwiązuje problem.

W jaki sposób większość aplikacji konsolowych rozwiązuje ten problem?

+0

Prawdopodobnie twój bełkot są ANSI escape sequnces http://stackoverflow.com/questions/16755142/how-to-make-win32-console-recognize-ansi-vt100-escape-sequences?lq=1 –

+2

tam zajrzeć : https://github.com/fusesource/jansi Jansi to mała biblioteka Java, która pozwala używać sekwencji kontrolnych ANSI do formatowania wyjścia konsoli, które działa nawet w oknach. –

+0

@AndreasFrische oh wow, który wygląda obiecująco! będzie musiał się z tym bawić! – flakes

Odpowiedz

1

Przy zastosowaniach końcowych charakter, są zawsze dwa końce w komunikacji, które muszą uzgodnić, jak interpretować znaki sterujące. Zwykle obie strony są zdolne do używania różnych kodowań opisanych w bazie danych termcap/.

Na Unix stronie serwera można określić kodowanie poprzez ustawienie zmiennej środowiskowej TERM lub używając stty (domyślnie jest używany inaczej, często emulacji terminala niemych).

Po stronie klienta należy również ustawić tę samą emulację terminala, co po stronie serwera. Rodzinny telnet Windows ma możliwość zdefiniowania emulacji (patrz np. Configure the Telnet Terminal Type), podobnie jak inne emulatory terminala (np. Putty).

Odnośnie do decyzji projektowych: Powyższe ustawienia terminali są zwykle opisane w dokumentacji użytkownika, a nie na stałe w aplikacji, aby pozostawić większą elastyczność. W końcu nie wiesz z góry, który terminal (tylko prosty terminal sprzętowy, obsługujący jedno kodowanie termcap, być może?) Użytkownicy będą używać.

(Ponieważ twoje pytanie ma niewiele wspólnego z Javą lub system.in, więc możesz ponownie rozważyć używane tagi.)