2015-12-25 9 views
8

पर "\ n" प्रिंट करना चाहिए, तो मैं अपने ऐप के लिए एक व्यवस्थापक कंसोल बनाने के लिए सॉकेट आईओ के साथ JLine 2 (v2.13) का उपयोग कर रहा हूं जिसे किसी के माध्यम से एक्सेस किया जा सकता है सामान्य टेलनेट ग्राहक। हालांकि मैंने पाया इसे बाहर अजीब प्रतीकों प्रिंट जब यह एक लाइन ब्रेक प्रिंट आउट करना चाहिए:jline2 प्रिंट "^ जे" जब इसे एक टेलनेट कंसोल

act.app.restart restart app^Jact.job.list List jobs 

सही उत्पादन किया जाना चाहिए:

act.app.restart restart app 
act.job.list  List jobs 

मैं कोड में पता लगाया और निम्न कोड पंक्ति में पाया गया कि मुसीबत का कारण:

enter image description here

एक और अजीब बात है जब मैं तीर दबाएँ इतिहास पाने के लिए, कंसोल प्रिंट बाहर +०१२३५९१९३०२२और कुछ भी नहीं होता है।

क्या किसी को कोई विचार है?

अद्यतन: जोड़ा प्रासंगिक स्रोत कोड

  1. कोड भेजे टेलनेट कनेक्शन को स्वीकार:

enter image description here

  1. कोड है कि बनाता है ConsoleReader और आदेश भेजता है:

enter image description here

अद्यतन 2

खेद है कि मैं थोड़ी देर के लिए गायब हो गए हैं। बस वापस आओ क्योंकि मेरी परियोजना मुझे ताजा हवा का सांस देती है। तो यहाँ क्या हुआ है: मैं एक PrintWriter बनाया है और ^J जारी करने के लिए एक समाधान के रूप में इसका इस्तेमाल किया है:

: जब jline2 टेलनेट सत्र के साथ प्रयोग किया जाता है

enter image description here

लेकिन वहाँ कई अन्य मुद्दे हैं

  1. टाइप <TAB> पूर्ण सूची को सक्रिय करने के बजाय टैब प्रदर्शित करता है। हालांकि, जब मैं एंटर कुंजी दबाता हूं तो यह मुझे एक पूर्ण सूची देता है और एक त्रुटि संदेश देता है: enter image description here
  2. टाइप <UP> तीर, ^[[A प्रदर्शित करता है, एंटर कुंजी दबाएं, यह मेरा अंतिम आदेश निष्पादित करेगा। हालांकि मैं कमांड लाइन संपादन

मुद्दा अभी भी वहाँ है और मेरा मानना ​​है कि हल करने के लिए यह सिर्फ कुछ गाइड की जरूरत है एक तरह से होना चाहिए ...

+1

क्या आपके पास उपयोग किए जा रहे क्लाइंट के लिए टर्मिनल कॉन्फ़िगर किया गया है? जिन वर्णों को आप देख रहे हैं वे शायद कर्सर को स्थानांतरित करने के लिए उपयोग किए जाने वाले भागने वाले अनुक्रम हैं, जो क्लाइंट को समझ में नहीं आते हैं जब तक कि कोई मेल नहीं खाता है, उदाहरण के लिए, यूनिक्स के बजाय vt-100 या windows के बजाय एएनएसआई। सुनिश्चित करें कि आप टर्मिनल एप्लिकेशन को ठीक से कॉन्फ़िगर कर रहे हैं। उदाहरण के लिए टर्मिनल टाइप ऑटो में देखें। –

+0

मैं लिनक्स टकसाल 17.3 पर हूं, जावा सर्वर से कनेक्ट करने के लिए सादे टेलनेट का उपयोग करें। और टेलनेट कनेक्शन अनुरोध का जवाब देने के लिए कोड https://github.com/actframework/actframework/blob/master/src/main/java/act/app/CliServer.java#L56 है। –

+0

बीटीडब्ल्यू, मुझे कक्षा टर्मिनल टाइप को jline2 स्रोत कोड में नहीं मिला। क्या आप यहां एक लिंक डाल सकते हैं? –

उत्तर

0

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

ConsoleReader.java यहाँ है: https://github.com/jline/jline2/blob/master/src/main/java/jline/console/ConsoleReader.java

मुझे लगता है कि यह पिछले संस्करण है, आदि

क्या आप कर रहे हैं एक ConsoleReader बुला println() उस पर पैदा कर रही है। एलएफ को^जे के रूप में दिखाया गया है।

/*3478*/ public void println(final CharSequence s) throws IOException { 
    print(s); 
    println(); 
} 

जो अंततः कॉल

/*3445*/private int print(final CharSequence buff, int start, int end, int cursorPos) throws IOException { 
     checkNotNull(buff); 
     for (int i = start; i < end; i++) { 
      char c = buff.charAt(i); 
      if (c == '\t') { 
       int nb = nextTabStop(cursorPos); 
       cursorPos += nb; 
       while (nb-- > 0) { 
        out.write(' '); 
       } 
      } else if (c < 32) { 
       out.write('^'); 
       out.write((char) (c + '@')); //LF -> ^J 

इस समारोह आप क्या चाहते हैं करता है लेकिन निजी होता है:: इस अर्थ में एक बग है कि विधि क्या कर रही है, जो उसे करना चाहिए था नहीं है

/*3510*/ private void rawPrintln(final String s) throws IOException { 
    rawPrint(s); // 
    println(); 
} 

/*3499*/ final void rawPrint(final String str) throws IOException { 
    out.write(str); 
    cursorOk = false; 
} 

इसे लाइन 375 पर लाइन स्ट्रिंग (अंतिम चारस्वेंस स्ट्र) पर सार्वजनिक विधियों और प्रिंट कॉलम (अंतिम संग्रह आइटम) के माध्यम से बुलाया जा सकता है। पुस्टस्ट्रिंग केवल मास्क किए गए आउटपुट का उपयोग करते समय इसे कॉल करता है, इसलिए यह यूज़ल है आप के लिए निबंध, और प्रिंट कॉलम पूरा होने के लिए मतलब प्रतीत होता है।

शायद आप अलग-अलग लाइनों को प्रिंट करना चाहते हैं और ConsoleReader को न्यूलाइन जोड़ने दें? तकनीकी रूप से, एलएफ एक नियंत्रण कोड है और कंसोल रीडर को कंट्रोल कोड प्रिंट करने के लिए मना करना समझ में आता है। बस अपने इनपुट को लाइनों में विभाजित करें, उन्हें एक-एक करके प्रिंट करें।

+0

मैंने अस्थायी रूप से '^ J' समस्या को हल करने के लिए पहले से ही बाहरी 'प्रिंटवाइटर' का उपयोग किया है। हालांकि '^ जे' की तुलना में अधिक अजीब चीजें हैं। मैं 'पूर्ण' को सक्रिय करने के लिए ' 'टाइप करता हूं, हालांकि यह टैब प्रदर्शित करता है, और जब मैं एंटर दबाता हूं, तो यह पूरी सूची दिखाता है, और फिर" कमांड मान्यता प्राप्त नहीं है: xxx "कहता है। मैं अपना अंतिम आदेश प्राप्त करने के लिए '' तीर टाइप करता हूं, यह '^ [[ए', जब मैं' 'दबाता हूं, तो यह मेरा अंतिम आदेश निष्पादित करता है, हालांकि मैंने अपना कमांड लाइन संपादन खो दिया –

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