2016-02-09 9 views
33

मैं RedHat चलाने वाले सर्वर के लिए एक कंसोल एप्लिकेशन डिज़ाइन कर रहा हूं। अंतिम उपयोगकर्ता इस ऐप को अपने चयन के किसी टर्मिनल के साथ चलाने में सक्षम होना चाहिए। (उदाहरण के लिए; जीनोम टर्मिनल, पुट्टी एसएसएच/टेलनेट, एमएस टेलनेट क्लाइंट और अन्य)।System.in के लिए पर्यावरण की स्थापना

अधिकांश टर्मिनल अनुप्रयोगों में कुछ भी गलत नहीं है, हालांकि जब मैं एमएस टेलनेट सत्र से अपना प्रोग्राम लॉन्च करता हूं, तो मुझे System.in और System.console() के लिए मेरा विशेष इनपुट पूरी तरह से गड़बड़ हो जाता है। बैकस्पेस स्क्रीन पर ^H लिख देगा और अन्य कुंजियां भी गिब्बरिश लिखेंगे।

मैंने इसे हैक कर लिया गया है पर्याप्त है कि मैं यह लगातार काम करने के लिए मिल सकता है, लेकिन मुझे यकीन है कि मैं क्या कर रहा हूँ सकल है:

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

करने में कोई समस्या यहाँ टर्मिनलों के लिए होगा कि डॉन xterm का समर्थन नहीं करते? मैंने देखा है कि माइक्रोसॉफ्ट टेलनेट क्लाइंट आपको सत्र शुरू करने से पहले TERM टाइप xterm पर सेट करने की अनुमति नहीं देता है। एक बार सत्र शुरू हो जाने के बाद, TERM=xterm सेटिंग को हल करने के लिए लगता है।

अधिकांश कंसोल एप्लिकेशन इस मुद्दे के बारे में कैसे जाते हैं?

+0

शायद अपने निरर्थक शब्दों एएनएसआई बच sequnces http://stackoverflow.com/questions/16755142/how-to-make-win32-console-recognize-ansi-vt100-escape-sequences?lq=1 –

+2

वहाँ देखने के लिए कर रहे हैं : https://github.com/fusesource/jansi जांसी एक छोटी जावा लाइब्रेरी है जो आपको अपने कंसोल आउटपुट को प्रारूपित करने के लिए एएनएसआई एस्केप अनुक्रमों का उपयोग करने की अनुमति देती है जो विंडोज़ पर भी काम करती है। –

+0

@AndreasFrische ओह वाह जो वादा करता है! इसके साथ खेलना होगा! – flakes

उत्तर

1
चरित्र टर्मिनल अनुप्रयोगों के साथ

, वहाँ हमेशा संचार में दोनों सिरों, जो कैसे नियंत्रण वर्ण की व्याख्या करने पर सहमत होना होगा रहे हैं। आम तौर पर दोनों पक्ष termcap/terminfo डेटाबेस में वर्णित विभिन्न कोडिंग का उपयोग करने में सक्षम हैं।

यूनिक्स सर्वर साइड आप, या stty का उपयोग करके TERM पर्यावरण चर सेट करके कोडिंग परिभाषित कर सकते हैं पर (एक डिफ़ॉल्ट, अन्यथा प्रयोग किया जाता है अक्सर एक गूंगा टर्मिनल अनुकरण)।

ग्राहक के पक्ष आप भी सर्वर साइड पर के रूप में एक ही टर्मिनल अनुकरण सेट करने के लिए पर। विंडोज मूल टेलनेट में इम्यूलेशन को परिभाषित करने की क्षमता है (उदाहरण के लिए Configure the Telnet Terminal Type), जैसा कि अन्य टर्मिनल अनुकरणकर्ता (उदा। पुट्टी) भी है।

अपने डिजाइन निर्णयों के बारे में: उपर्युक्त टर्मिनल सेटिंग आमतौर पर केवल उपयोगकर्ता प्रलेखन में वर्णित होती है, और अधिक लचीलापन छोड़ने के लिए, एप्लिकेशन में हार्डकोड नहीं होती है। आखिरकार, आप पहले से नहीं जानते कि टर्मिनल (केवल एक साधारण हार्डवेयर टर्मिनल, एक टर्मकैप कोडिंग का समर्थन कर सकता है, शायद?) आपके उपयोगकर्ता उपयोग करने जा रहे हैं।

(जैसा कि आपके प्रश्न जावा या system.in के साथ बहुत कम है, इसलिए आप अपने द्वारा उपयोग किए जाने वाले टैग पर दोबारा विचार कर सकते हैं।)

संबंधित मुद्दे