2010-09-15 55 views
5

我正在解碼http數據包。 而我面臨的問題是大塊問題。 當我得到一個http數據包時,它有一個標題和正文。 當transefer編碼分塊時,我不知道該怎麼辦?java中的分塊http解碼?

是否有一個有用的API或類用於在JAVA中分離數據?

如果有人,有關http解碼的經驗,請告訴我一個方法如何做到這一點?

回答

11

使用全功能的HTTP客戶端,如Apache HttpComponents Client或僅提供的Java SE java.net.URLConnectionmini tutorial here)。兩者都完全透明地處理它,並給你一個「正常」的背部。 HttpClient反過來也帶有一個ChunkedInputStream,你只需要裝飾你的InputStream

如果你真的堅持爲此建立一個圖書館,那麼我建議創建一個像ChunkedInputStream extends InputStream這樣的類並相應地編寫邏輯。你可以在this Wikipedia article找到更多的細節。

+0

其實我離線HTTP解碼,我只是頭和身體的http數據包。我會解碼數據包。但我需要一個API來獲取標題和正文,並給我解碼的數據。 是否有這麼api? – CodingForever 2010-09-15 13:38:55

+0

維基百科文章包含詳細信息塊的外觀。你基本上可以分裂成CRLF(\ r \ n)。它是字節10和13.第一部分是以十六進制表示塊長度的標題。第二部分是塊數據本身。您只需收集並連接所有這些塊。 'ChunkedInputStream'就是這樣做的。 – BalusC 2010-09-15 13:46:19

+0

,因爲你的答案是正確的。 – CodingForever 2010-09-15 14:32:45

1

阿帕奇​​

哦,如果我們談論的是客戶端,HttpUrlConnection做到這一點爲好。

+0

我將離線HTTP解碼(已捕獲的數據包),我只有一個頭和一個正文。 所以我需要一個API,只是頭和身體,並給我解碼的數據。 有沒有這樣的API? – CodingForever 2010-09-15 13:40:14

1

如果您正在尋找一個簡單的API嘗試Jodd Http庫(http://jodd.org/doc/http.html)。 它爲您處理分塊傳輸編碼,並將整個身體作爲一個字符串返回。

從文檔:

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

System.out.println(response); 
1

這裏是快速和骯髒的替代方案,要求除了甲骨文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做幕後。

此實現不提供錯誤內容格式的詳細例外(行號)。

它適用於Java 8,但可能會在下一版本中失敗。你已被警告。

雖然可以用於原型製作。

您可以從Convert InputStream to byte array in Java中選擇任何readFully執行。