2010-09-15 13 views
5

मैं http पैकेट डीकोड कर रहा हूं। और मुझे एक समस्या का सामना करना पड़ा जो समस्या को हल करता था। जब मुझे एक http पैकेट मिलता है तो इसमें हेडर और बॉडी होती है। जब ट्रांसेफर-एन्कोडिंग टूट जाती है तो मुझे नहीं पता कि क्या करना है?जावा में चकित http डिकोडिंग?

क्या जावा में डेटा को डिचंक करने के लिए कोई उपयोगी API या कक्षा है?

और यदि कोई व्यक्ति, http डिकोडिंग के बारे में अनुभव करता है, तो कृपया मुझे यह तरीका कैसे दिखाएं?

उत्तर

11

Apache HttpComponents Client या केवल जावा एसईप्रदान किए गए एक पूर्ण योग्य HTTP क्लाइंट का उपयोग करें (mini tutorial here)। दोनों इसे पूरी तरह से पारदर्शी रूप से संभालते हैं और आपको "सामान्य" InputStream वापस देता है। बदले में HttpClient भी ChunkedInputStream के साथ आता है जिसे आपको बस अपने InputStream को सजाने के लिए है।

यदि आप वास्तव में इसके लिए लाइब्रेरी होमग्रोइंग करने का आग्रह करते हैं, तो मैं ChunkedInputStream extends InputStream जैसी कक्षा बनाने और तदनुसार तर्क लिखने का सुझाव दूंगा। आप this Wikipedia article में इसे पार्स करने के तरीके के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

+0

असल में मैं ऑफ़लाइन http डिकोडिंग करता हूं और मेरे पास http पैकेट का हेडर और बॉडी है। और मैं पैकेट डीकोड कर दूंगा। लेकिन मुझे एक एपीआई चाहिए जो हेडर और बॉडी पाती है और मुझे डीकोडेड डेटा देती है। क्या एपीआई है? – CodingForever

+0

विकिपीडिया आलेख में विस्तार है कि एक खंड कैसे दिखता है। आप मूल रूप से केवल सीआरएलएफ (\ r \ n) पर विभाजित हो सकते हैं। यह 10 और 13 बाइट्स हैं। पहला भाग हेडर है जो हेक्स में खंड लंबाई का प्रतिनिधित्व करता है। दूसरा भाग तब खंड डेटा है। आप बस उन सभी हिस्सों को इकट्ठा और जोड़ते हैं। 'ChunkedInputStream' ठीक वही करता है। – BalusC

+0

क्योंकि आपका उत्तर सही है। – CodingForever

1

अपाचे HttpComponents

ओह, और साथ ही अगर हम ग्राहक के पक्ष के बारे में बात कर रहे हैं, HttpUrlConnection करता है।

+0

मैं ऑफलाइन डीकोडिंग (पहले ही कब्जा कर लिया गया पैकेट) ऑफ़लाइन करूंगा और मेरे पास केवल एक हेडर और बॉडी है। तो मुझे एक एपीआई चाहिए जो केवल हेडर और बॉडी प्राप्त करे और मुझे डेटा को डीकोड किया जाए। क्या इस तरह कोई एपीआई है? – CodingForever

1

यदि आप एक साधारण एपीआई की तलाश में हैं तो जोड एचटीपी लाइब्रेरी (http://jodd.org/doc/http.html) का प्रयास करें। यह आपके लिए चंकेड ट्रांसफर एन्कोडिंग को संभालता है और आप पूरे शरीर को एक स्ट्रिंग बैक के रूप में प्राप्त करते हैं।

डॉक्स से:

HttpRequest httpRequest = HttpRequest.get("http://jodd.org"); 
HttpResponse response = httpRequest.send(); 

System.out.println(response); 
1

यहाँ त्वरित और गंदा वैकल्पिक कि Oracle JRE को छोड़कर कोई निर्भरता की आवश्यकता है:

private static byte[] unchunk(byte[] content) throws IOException { 
    ByteArrayInputStream bais = new ByteArrayInputStream(content); 
    ChunkedInputStream cis = new ChunkedInputStream(bais, new HttpClient() {}, null); 
    return readFully(cis); 
} 

यह का उपयोग करता है एक ही sun.net.www.http.ChunkedInputStreamjava.net.HttpURLConnection के रूप में दृश्य के पीछे है।

यह कार्यान्वयन गलत सामग्री प्रारूप पर विस्तृत अपवाद (लाइन नंबर) प्रदान नहीं करता है।

यह जावा 8 के साथ काम करता है लेकिन अगली रिलीज के साथ विफल हो सकता है। आपको चेतावनी दी गई थी।

हालांकि प्रोटोटाइप के लिए उपयोगी हो सकता है।

आप Convert InputStream to byte array in Java से readFully कार्यान्वयन चुन सकते हैं।

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