-
-
<</span>PRE
class=java name="code">HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程 HTML ,CSS,Javascript , Text ,它可以节省 40% 左右的流量。更为重要的是,它可以对动态生成的,包括 CGI 、 PHP , JSP , ASP , Servlet,SHTML 等输出的网页也能进行压缩,压缩效率惊人 -
1
<</span> Connector port ="80" maxHttpHeaderSize ="8192" -
2
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75" -
3
enableLookups ="false" redirectPort ="8443" acceptCount ="100" -
4
connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="utf-8" /> -
5
-
一旦启用了这个压缩功能后,我们怎么来测试压缩是否有效呢?首先
Tomcat 是根据浏览器请求头中的 accept-encoding来判断浏览器是否支持压缩功能,如果这个值包含有 gzip ,就表明浏览器支持 gzip 压缩内容的浏览,所以我们可以用httpclient 来写一个这样的简单测试程序 -
-
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。一般服务器中都安装有这个功能模块的,服务器端不需做改动。
-
-
当浏览器支持gzip
格式的时候, 服务器端会传输gzip格式的数据。 -
-
从Http
技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-Encoding=gzip 。 -
-
我们现在从浏览器上访问玩啥网站都是gzip格式传输的。
-
-
但是我们现在Android
客户端,没有用gzip 格式访问。 -
-
同样的的道理,我们可以在android
客户端 request 头中加入 "Accept-Encoding", "gzip" ,来让服务器传送gzip 数据。 -
- 具体代码如下。
-
-
private String getJsonStringFromGZIP(HttpResponse response) { -
String jsonString = null; -
try { -
InputStream is = response.getEntity().getContent(); -
BufferedInputStream bis = new BufferedInputStream(is); -
bis.mark(2); -
// 取前两个字节 -
byte[] header = new byte[2]; -
int result = bis.read(header); -
// reset输入流到开始位置 -
bis.reset(); -
// 判断是否是GZIP格式 -
int headerData = getShort(header); -
// Gzip 流 的前两个字节是 0x1f8b -
if (result != -1 && headerData == 0x1f8b) { LogUtil.d("HttpTask", " use GZIPInputStream "); -
is = new GZIPInputStream(bis); -
} else { -
LogUtil.d("HttpTask", " not use GZIPInputStream"); -
is = bis; -
} -
InputStreamReader reader = new InputStreamReader(is, "utf-8"); -
char[] data = new char[100]; -
int readSize; -
StringBuffer sb = new StringBuffer(); -
while ((readSize = reader.read(data)) > 0) { -
sb.append(data, 0, readSize); -
} -
jsonString = sb.toString(); -
bis.close(); -
reader.close(); -
} catch (Exception e) { -
LogUtil.e("HttpTask", e.toString(),e); -
} -
-
LogUtil.d("HttpTask", "getJsonStringFromGZIP net output : " + jsonString ); -
return jsonString; -
} -
-
private int getShort(byte[] data) { -
return (int)((data[0]<</span><</span>8) | data[1]&0xFF); -
} -
-
参考
,注意实际使用中,我发现gzip 流前两个字节是0x1e8b ,不是0x1f8b .后来检查一下code ,代码处理错误,加上第二个字节的时候需 &0xFF
-
<</span>PRE
android开发中使用GZIP压缩传输
最新推荐文章于 2023-04-03 17:19:03 发布