对于我的一个项目,我必须编写自己的精简版网络服务器。 目前它正在做我想做的事情,但是有点......慢。至少对我来说慢一点。 因此我正在考虑实现 gzip 压缩来加快速度。 方法如下。
public static String encodeToGZip(String data) {
ByteArrayOutputStream bout = null;
try {
bout = new ByteArrayOutputStream();
GZIPOutputStream output = new GZIPOutputStream(bout);
output.write(data.getBytes());
output.flush();
output.close();
bout.close();
} catch (IOException ex) {
ex.printStackTrace();
}
try {
return new String(bout.toByteArray(), "UTF-8");
} catch (UnsupportedEncodingException ex) {
return null;
}
}
问题是网络服务器无法解码我发送的数据。尽管它声明它接受 gzip 编码,所以我必须发送一些损坏的数据。
这就是结果。 wireshark嗅探==> GET/login.html HTTP/1.1
主机:本地主机:9090
连接:保持 Activity 状态
缓存控制:无缓存
编译指示:无缓存
用户代理:Mozilla/5.0(Macintosh;Intel Mac OS X 10_7_3)AppleWebKit/535.11(KHTML,如 Gecko)Chrome/17.0.963.79 Safari/535.11
接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
接受编码:gzip、deflate、sdch
接受语言:en-US,en;q=0.8
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
<小时/>HTTP/1.1 200 正常
连接:关闭
服务器:My Lite Server v0
内容编码:gzip
内容类型:text/html
............T...N...0....#.......O...?...$.. ……BB……g……6……[……u……6………… …………g6e…………S……c……$……`我 Gw............AOAhU...XO...d...].... IU...h...+......[.... .Y.........b...|x.........rm1.........1.....L...uI... ......S...n......F......T2.[$X.......M.....M。 #*.........d....58HL:....Wx......Z....m...t.. .Z.)'XQdg ......X......~......(......<.......p/....... …………”……6|7……3 ...r.Sv.../...rT...".........SrJ.........M.vR^...4$。 .. .q...x.................../...8...........M...y#... j......7........d..le......;.................~......的......
最佳答案
return new String(bout.toByteArray(), "UTF-8");
方法中的这一行将产生垃圾字符串。
上面的构造函数执行从给定编码到 UTF-16 的转码操作。您获取一堆任意字节并尝试将它们解码为 UTF-8。您只能将 UTF-8 编码的字符数据解码为 UTF-8。 Java没有二进制安全的字符串(所有字符串都是UTF-16);您必须使用字节数组。
只需将压缩字节写入您的OutputStream
。
避免使用 data.getBytes()
,因为它使用默认的系统编码。这将产生不可移植的代码,因为默认系统编码取决于系统和配置。永远喜欢setting an encoding explicitly .
关于java - html 的 HTTP gzip 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814164/