7

我正在解码http数据包。我遇到了块问题。当我收到一个 http 数据包时,它有一个标题和正文。当传输编码被分块时,我不知道该怎么办?

是否有有用的 API 或类用于对 JAVA 中的数据进行解块?

如果有人对http解码有经验,请告诉我如何做到这一点?

4

4 回答 4

12

使用完整的 HTTP 客户端,例如Apache HttpComponents Client或仅提供 Java SE java.net.URLConnection此处为迷你教程)。两者都完全透明地处理它并给你一个“正常”的InputStream背部。HttpClient 反过来也带有一个ChunkedInputStream你只需要装饰你InputStream的东西。

如果您真的坚持为此建立一个图书馆,那么我建议您创建一个类似的类ChunkedInputStream extends InputStream并相应地编写逻辑。您可以在这篇 Wikipedia 文章中找到如何解析它的更多详细信息。

于 2010-09-15T12:46:31.390 回答
1

Apache HttpComponents

哦,如果我们谈论的是客户端,HttpUrlConnection也会这样做。

于 2010-09-15T12:45:07.623 回答
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);
于 2014-05-30T07:26:28.640 回答
0

这是除了 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.ChunkedInputStream方式。java.net.HttpURLConnection

此实现不提供错误内容格式的详细异常(行号)。

它适用于 Java 8,但在下一个版本中可能会失败。你已经被警告过了。

不过可能对原型设计很有用。

您可以从Convert InputStream to byte array in Java中选择任何readFully实现。

于 2015-09-11T08:35:25.960 回答