2016-02-09 22 views
33

Tôi đang thiết kế ứng dụng bảng điều khiển cho máy chủ chạy RedHat. Người dùng cuối sẽ có thể chạy ứng dụng này với bất kỳ thiết bị đầu cuối nào mà họ chọn. (Ví dụ: Gnome Terminal, Putty SSH/Telnet, MS Telnet Client và những người khác).Cài đặt Môi trường cho System.in

Trong hầu hết các ứng dụng đầu cuối không có gì sai, tuy nhiên khi tôi khởi chạy chương trình từ phiên telnet MS, tôi nhận thấy đầu vào đặc biệt của mình cho System.inSystem.console() hoàn toàn bị rối loạn. Một backspace sẽ viết ^H vào màn hình và các phím khác cũng viết sai ngữ pháp.

Tôi đã hack vào nó đủ để tôi có thể lấy nó để liên tục làm việc, nhưng tôi chắc chắn những gì tôi đang làm là tổng:

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

Nên có một vấn đề ở đây cho thiết bị đầu cuối mà don Không hỗ trợ xterm? Tôi nhận thấy rằng ứng dụng Microsoft Telnet không cho phép bạn đặt loại TERM thành xterm trước khi bạn bắt đầu phiên. Tuy nhiên, khi phiên được bắt đầu, việc đặt TERM=xterm có vẻ như sẽ giải quyết được sự cố.

Hầu hết các ứng dụng giao diện điều khiển đều gặp vấn đề này như thế nào?

+0

Có thể là ngữ pháp của bạn là các trình tự thoát ansi. Http://stackoverflow.com/questions/16755142/how-to-make-win32-console-recognize-ansi-vt100-escape-sequences?lq=1 –

+2

nhìn ở đó : https://github.com/fusesource/jansi Jansi là một thư viện java nhỏ cho phép bạn sử dụng các chuỗi thoát ANSI để định dạng đầu ra bàn điều khiển của bạn hoạt động ngay cả trên các cửa sổ. –

+0

@AndreasFrische oh wow có vẻ đầy hứa hẹn! sẽ phải chơi đùa với nó! – flakes

Trả lời

1

Với các ứng dụng thiết bị đầu cuối nhân vật, luôn có hai đầu trong giao tiếp, mà phải đồng ý về cách giải thích các ký tự điều khiển. Thông thường cả hai bên đều có khả năng sử dụng một loạt các mã được mô tả trong cơ sở dữ liệu termcap/terminfo.

Trên máy chủ Unix bạn có thể xác định mã bằng cách đặt biến môi trường TERM hoặc bằng cách sử dụng stty (mặc định được sử dụng khác, thường là mô phỏng thiết bị đầu cuối câm).

Ở phía máy khách bạn cũng phải đặt cùng một mô phỏng thiết bị đầu cuối như ở phía máy chủ. Telnet gốc của Windows có khả năng xác định mô phỏng (xem ví dụ: Configure the Telnet Terminal Type), cũng như các trình giả lập thiết bị đầu cuối khác (ví dụ: Putty).

Về các quyết định thiết kế của bạn: Cài đặt đầu cuối ở trên thường chỉ được mô tả trong tài liệu người dùng và không được mã hóa cứng trong ứng dụng, để linh hoạt hơn. Sau khi tất cả, bạn không biết trước mà thiết bị đầu cuối (chỉ có một thiết bị đầu cuối phần cứng đơn giản, hỗ trợ một mã hóa termcap duy nhất, có lẽ?) Người dùng của bạn sẽ sử dụng.

(Vì câu hỏi của bạn ít liên quan đến Java hoặc system.in nên bạn có thể xem xét lại các thẻ bạn sử dụng.)

Các vấn đề liên quan