2011-06-15 24 views
5

से डेटा प्राप्त नहीं किया गया है, मैं एक क्लाइंट एप्लिकेशन लिख रहा हूं जो टीसीपी/आईपी के माध्यम से डेटा का निरंतर प्रवाह प्राप्त करेगा। मेरी समस्या यह है कि buffered पाठक ऑब्जेक्ट को कोई डेटा प्राप्त नहीं हो रहा है और रीडलाइन विधि पर लटक रहा है।पाठक को सॉकेट

सर्वर जिस तरह से काम करता है वह यह है कि आप उससे कनेक्ट होते हैं, और फिर डेटा प्राप्त करने के लिए प्रमाणीकरण जानकारी भेजते हैं। मेरे कोड का सार

नीचे
socket = new Socket(strHost, port); 
authenticate(); 
inStream = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
process(inStream); 

authenticate() 
{  
    PrintWriter pwriter = new PrintWriter(socket.getOutputStream(), true); 
    pwriter.println(authString); 
} 

process(BufferedReader bufferedReader) 
{ 
    while((line = bufferedReader.readLine()) != null) 
     dostuff 
} 

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

data;data;data;data;data 
data;data;data;data;data 

क्यों मेरे ऐप ReadLine में व्यतीत कर रहा है, मैं सही ढंग से प्रमाणीकरण लाइन outputting नहीं कर रहा हूँ:

डेटा (टेलनेट कम से कम के माध्यम से) में आने वाले निम्न में से एक सतत स्ट्रीम की तरह दिखता है? मैं किसी भी त्रुटि मेरे नमूना सर्वर कोड (जो सही ढंग से काम कर रहा है) प्राप्त नहीं हो रहा ...

संपादित करें ... फिर से इस एक ही रास्ता नकल उतार रहा है मुझे लगता है कि वास्तविक सर्वर चल रहा है लेकिन मैं अपने आवेदन में दोनों से कनेक्ट कर सकता हूं बस वास्तविक सर्वर से डेटा प्राप्त नहीं करता हूं।

public static void main(String[] args) throws IOException 
    { 
    ServerSocket serverSocket = null; 

    try 
    { 
    serverSocket = new ServerSocket(1987); 
    } 
    catch (IOException e) 
    { 
    System.out.println("Couldn't listen on port: 1987"); 
    System.exit(-1); 
    } 

    Socket clientSocket = null; 
    try 
    { 
    clientSocket = serverSocket.accept(); 
    } 
    catch (IOException e) { 
    System.out.println("Accept failed: 1987"); 
    System.exit(-1); 
    } 

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    String something; 

    while ((something = in.readLine()) != null) 
    { 
    while(true) 
    { 
     out.println(message); 
    } 
    } 



    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 
} 
+0

आप हमें सर्वर समस्या से संबंधित कोड दिखा सकते हैं मुझे सॉकेट के साथ के साथ इस काम करता है? – Coeffect

+0

'मैं अपने आवेदन में सर्वर से जुड़ा जुड़ा हूं।' आपका मतलब है कि आपका डमी नमूना सर्वर? – leonbloy

+0

हो सकता है कि आपके पास अपना डेटा पढ़ने के लिए एक और धागा तैयार हो, __fore_ आप प्रमाणीकरण भेजते हैं? मुझे लगता है कि जैसे ही यह पासवर्ड प्राप्त होता है, सर्वर बस बाढ़ डेटा शुरू करता है। – toto2

उत्तर

10

सबसे पहले आप readLine() बुला, अगर इसे पढ़ने के लिए ठीक है के रूप में ready() आपको बता देंगे से पहले BufferedReader.ready() फोन करना चाहिए।

PrintWriter आई/ओ अपवाद फेंक नहीं देता है इसलिए लेखन आपके ज्ञान के बिना असफल हो सकता है, यही कारण है कि पढ़ने के लिए कुछ भी नहीं है। लिखने के दौरान कुछ भी गलत होने पर यह देखने के लिए PrintWriter.checkError() का उपयोग करें।

आपको पाइप के नीचे कुछ लिखने से पहले Socket पर इनपुट और आउटपुट स्ट्रीम सेट अप करना चाहिए। यदि आपका पाठक तैयार नहीं होता है तो दूसरा अंत लिखने की कोशिश करता है तो आपको सर्वर में टूटा हुआ पाइप मिल जाएगा और यह कोई और डेटा नहीं भेजेगा। आपके द्वारा लिखा या पढ़ने से पहले टेलनेट सेट और लिखता है।

आप यह बताने के लिए Wireshark का उपयोग कर सकते हैं कि सर्वर वास्तव में डेटा भेज रहा है या नहीं।

+1

bufferedreader.ready चाल चल रहा था, printwriter.checkerror पर टिप के लिए धन्यवाद, साथ ही मैं इसे अपने कोड में जोड़ रहा हूं। – Ryan

+0

@DavidNewcomb मुझे कुछ भेजने से पहले सॉकेट के इनपुटस्ट्रीम से बुफर्ड रीडर को क्यों सेट अप करना चाहिए? क्या यह वास्तव में डेटा आता है जो पहले आता है? यह डेटा स्रोतों के साथ कैसे काम करता है जिनके पास हमेशा प्रारंभिक डेटा उपलब्ध होता है? - मुझे उम्मीद है कि कोई स्ट्रीम रैपर लाने के लिए, लेकिन प्रारंभिक डेटा नहीं खाएगा? –

+1

BufferedXxx के साथ आप यह नहीं कह सकते कि पढ़ना या लिखना वास्तव में कब होगा। संचार चैनल एक पाइप है और पाइपों में पाठकों और लेखकों के साथ मिलकर काम करना चाहिए। यह डेटा नहीं खाता है, अगर आप कुछ लिखने की कोशिश करते हैं तो आपको टूटी हुई पाइप मिलती है और इसे पढ़ने के लिए कुछ भी नहीं है, वैसे ही जैसे आपका पढ़ना बंद हो जाएगा यदि कोई भी दूसरी तरफ लिख नहीं रहा है। –

8

BufferdReader.readLine() लाइनें पढ़ता है, यानी \r या \r\n के साथ समाप्त वर्णों के अनुक्रम। मुझे लगता है कि आपका सर्वर एक आउटपुट में एक आउटपुट लिखता है। आपका टेलनेट आउटपुट इस धारणा को साबित करता है। सर्वर पक्ष पर बस PrintWriter.println() का उपयोग करें।

+1

या उसे 'read (char [] cbuf, int का उपयोग करना होगा ऑफ, int लेन) 'अगर यह एक सतत निरंतर धारा है। – toto2

-1

बिना फ्लश

void start_listen() 
    { 
     String result1=""; 
     char[] incoming = new char[1024]; 
     while (!s.isClosed()) 
     { 
      try { 

      int lenght = input.read(incoming); 
       result1 = String.copyValueOf(incoming,0,lenght); 


      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      Log.d("ddddddddddd",result1); 

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