我正在解碼http數據包。 而我面臨的問題是大塊問題。 當我得到一個http數據包時,它有一個標題和正文。 當transefer編碼分塊時,我不知道該怎麼辦?java中的分塊http解碼?
是否有一個有用的API或類用於在JAVA中分離數據?
如果有人,有關http解碼的經驗,請告訴我一個方法如何做到這一點?
我正在解碼http數據包。 而我面臨的問題是大塊問題。 當我得到一個http數據包時,它有一個標題和正文。 當transefer編碼分塊時,我不知道該怎麼辦?java中的分塊http解碼?
是否有一個有用的API或類用於在JAVA中分離數據?
如果有人,有關http解碼的經驗,請告訴我一個方法如何做到這一點?
使用全功能的HTTP客戶端,如Apache HttpComponents Client或僅提供的Java SE java.net.URLConnection
(mini tutorial here)。兩者都完全透明地處理它,並給你一個「正常」的背部。 HttpClient反過來也帶有一個ChunkedInputStream
,你只需要裝飾你的InputStream
。
如果你真的堅持爲此建立一個圖書館,那麼我建議創建一個像ChunkedInputStream extends InputStream
這樣的類並相應地編寫邏輯。你可以在this Wikipedia article找到更多的細節。
阿帕奇
哦,如果我們談論的是客戶端,HttpUrlConnection做到這一點爲好。
我將離線HTTP解碼(已捕獲的數據包),我只有一個頭和一個正文。 所以我需要一個API,只是頭和身體,並給我解碼的數據。 有沒有這樣的API? – CodingForever 2010-09-15 13:40:14
如果您正在尋找一個簡單的API嘗試Jodd Http庫(http://jodd.org/doc/http.html)。 它爲您處理分塊傳輸編碼,並將整個身體作爲一個字符串返回。
從文檔:
HttpRequest httpRequest = HttpRequest.get("http://jodd.org");
HttpResponse response = httpRequest.send();
System.out.println(response);
這裏是快速和骯髒的替代方案,要求除了甲骨文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.ChunkedInputStream
爲java.net.HttpURLConnection
做幕後。
此實現不提供錯誤內容格式的詳細例外(行號)。
它適用於Java 8,但可能會在下一版本中失敗。你已被警告。
雖然可以用於原型製作。
您可以從Convert InputStream to byte array in Java中選擇任何readFully
執行。
其實我離線HTTP解碼,我只是頭和身體的http數據包。我會解碼數據包。但我需要一個API來獲取標題和正文,並給我解碼的數據。 是否有這麼api? – CodingForever 2010-09-15 13:38:55
維基百科文章包含詳細信息塊的外觀。你基本上可以分裂成CRLF(\ r \ n)。它是字節10和13.第一部分是以十六進制表示塊長度的標題。第二部分是塊數據本身。您只需收集並連接所有這些塊。 'ChunkedInputStream'就是這樣做的。 – BalusC 2010-09-15 13:46:19
,因爲你的答案是正確的。 – CodingForever 2010-09-15 14:32:45