gpt4 book ai didi

java - GZIPOutputStream 未正确压缩 HTTP 响应的字符串

转载 作者:行者123 更新时间:2023-12-04 05:56:12 26 4
gpt4 key购买 nike

我正在编写一个简单的 Java http 服务器,它用 JSON 数据进行响应。我试图在发送数据之前对数据进行 GZip 压缩,但它通常会发回在浏览器中产生错误的 gzip 数据。例如,在 Firefox 中它说:

内容编码错误
您尝试查看的页面无法显示,因为它使用了无效或不受支持的压缩形式。

有时,如果我压缩的字符串很小而没有某些字符,它会起作用,但是当有括号等时它似乎会困惑。特别是,我下面的示例文本失败了。

这是某种字符编码问题吗?我尝试了各种各样的东西,但它只是不想轻松工作。

String text;            
private Socket server;
DataInputStream in = new DataInputStream(server.getInputStream());
PrintStream out = new PrintStream(server.getOutputStream());

while ((text = in.readLine()) != null) {
// ... process header info
if (text.length() == 0) break;
}

out.println("HTTP/1.1 200 OK");
out.println("Content-Encoding: gzip");
out.println("Content-Type: text/html");
out.println("Connection: close");


// x is the text to compress
String x = "jsonp1330xxxxx462022184([[";
ByteArrayOutputStream outZip = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(outZip);

byte[] b = x.getBytes(); // Changing character encodings here makes no difference

gzip.write(b);
gzip.finish();
gzip.close();
outZip.close();
out.println();
out.print(outZip);
server.close();

最佳答案

接受的答案是不正确的。
GZIPOutputStream确实可以用来实现gzip HTTP 中的内容编码。事实上,这正是我在 JLHTTP 中实现它的方式。轻量级 HTTP 服务器。支持 deflate内容编码相同,只是 DeflaterOutputStream改为使用。上面代码的问题只是它有问题:-)

  • 全部 println语句(包括底部的语句)应替换为 print和明确的 \r\n在字符串的末尾。这是因为 println 打印的换行符是平台相关的,所以例如在 Linux 上它只会打印 \n ,而 HTTP 需要完整的 CRLF ( \r\n )。
  • out.print(outZip)基本上是打电话outZip.toString()并将其打印到流中。然而,outZip包含压缩的二进制数据,因此将其转换为字符串(使用任意平台默认编码,不少于),很可能会损坏数据。
  • 代码获取字符串,将其转换为字节,压缩它们,将它们转换回字符串,将它们转换回字节并将它们写出。相反,它只需要将字符串转换为字节,压缩它们并写出它们。您不需要 ByteArrayOutputStream为此,GZIPOutputStream可以直接包装底层输出流。只是不要忘记在标题(和尾随 CRLF)之后刷新打印流,然后才从正文的压缩流开始。
  • 关闭资源应该在 finally 或 try-with-resources 块中完成,并以正确的顺序和时间完成。
  • 在此示例中,连接在流结束时关闭,这很好。但一般来说,如果您想保持连接 Activity 并流式传输未知长度的潜在大数据(您事先不知道压缩大小),则需要实现 chunked传输编码也是如此(这很简单)。

  • 代码修复后, GZIPOutputStream奇迹般有效。

    但是,虽然非常适合教育目的,但请注意,这不是 HTTP 服务器,即使已修复。您可以进一步阅读 RFC 2616 或 7230 以了解 HTTP 还需要做什么……但为什么要重新发明呢?有一堆轻量级的可嵌入 HTTP 服务器,您可以使用它们轻松完成工作, JLHTTP他们之中。

    关于java - GZIPOutputStream 未正确压缩 HTTP 响应的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495164/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com