首页 > 其他分享 >android开发中使用GZIP压缩传输

android开发中使用GZIP压缩传输

时间:2023-04-30 11:32:16浏览次数:38  
标签:gzip int 传输 GZIP new android data bis 客户端

1. class=java name="code">HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程 HTML ,CSS,Javascript , Text ,它可以节省 40% 左右的流量。更为重要的是,它可以对动态生成的,包括 CGI 、 PHP , JSP , ASP , Servlet,SHTML 等输出的网页也能进行压缩,压缩效率惊人  
2.      <</span> Connector port ="80" maxHttpHeaderSize ="8192"   
3.                 maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"   
4.                 enableLookups ="false" redirectPort ="8443" acceptCount ="100"   
5.                 connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="utf-8" />   
6.      
7. Tomcat 是根据浏览器请求头中的 accept-encoding来判断浏览器是否支持压缩功能,如果这个值包含有 gzip ,就表明浏览器支持 gzip 压缩内容的浏览,所以我们可以用httpclient 来写一个这样的简单测试程序     
8.  
9.  
10.  
11. 格式的时候, 服务器端会传输gzip格式的数据。  
12.  
13. 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-Encoding=gzip 。  
14.  
15.  
16.  
17. 客户端,没有用gzip 格式访问。  
18.  
19. 客户端 request 头中加入 "Accept-Encoding", "gzip" ,来让服务器传送gzip 数据。  
20.  
21. 具体代码如下。  
22.  
23.   private String getJsonStringFromGZIP(HttpResponse response) {  
24.        String jsonString = null;  
25.        try {  
26.            InputStream is = response.getEntity().getContent();  
27.            BufferedInputStream bis = new BufferedInputStream(is);  
28.            bis.mark(2);  
29.            // 取前两个字节  
30.            byte[] header = new byte[2];  
31.            int result = bis.read(header);  
32.            // reset输入流到开始位置  
33.            bis.reset();  
34.            // 判断是否是GZIP格式  
35.            int headerData = getShort(header);  
36.            // Gzip 流 的前两个字节是 0x1f8b  
37.            if (result != -1 && headerData == 0x1f8b) { LogUtil.d("HttpTask", " use GZIPInputStream  ");  
38.                is = new GZIPInputStream(bis);  
39.            } else {  
40.                LogUtil.d("HttpTask", " not use GZIPInputStream");  
41.                is = bis;  
42.            }  
43.            InputStreamReader reader = new InputStreamReader(is, "utf-8");  
44.            char[] data = new char[100];  
45.            int readSize;  
46.            StringBuffer sb = new StringBuffer();  
47.            while ((readSize = reader.read(data)) > 0) {  
48.                sb.append(data, 0, readSize);  
49.            }  
50.            jsonString = sb.toString();  
51.            bis.close();  
52.            reader.close();  
53.        } catch (Exception e) {  
54.            LogUtil.e("HttpTask", e.toString(),e);  
55.        }  
56.   
57.        LogUtil.d("HttpTask", "getJsonStringFromGZIP net output : " + jsonString );  
58.        return jsonString;  
59.    }  
60.   
61.    private int getShort(byte[] data) {  
62.        return (int)((data[0]<</span><</span>8) | data[1]&0xFF);  
63.    }  
64.  
65. ,注意实际使用中,我发现gzip 流前两个字节是0x1e8b ,不是0x1f8b .后来检查一下code ,代码处理错误,加上第二个字节的时候需 &0xFF

标签:gzip,int,传输,GZIP,new,android,data,bis,客户端
From: https://blog.51cto.com/u_548275/6237832

相关文章

  • android有序广播和无序广播的区别
    BroadcastReceiver所对应的广播分两类:普通广播和有序广播。普通广播通过Context.sendBroadcast()方法来发送。它是完全异步的。所有的receivers接收器的执行顺序不确定。  因此,所有的receivers接收器接收broadcast的顺序不确定。这种方式效率更......
  • Android 检测是否有ROOT权限
    android(linux)很多命令需要root权限才能执行,比如说查看系统目录文件等,如果我们的程序需要用到查看此类文件或执行系统命令,就必须先获取Root权限。1.importjava.io.DataInputStream;2.importjava.io.DataOutputStream;3.importjava.io.InputStream;4.impor......
  • Android手机信息
    获取手机屏幕高度  1.privatevoidgetWeithAndHeight(){2.//这种方式在service中无法使用,3.DisplayMetricsdm=newDisplayMetrics();4.getWindowManager().getDefaultDisplay().getMetrics(dm);5.Stringw......
  • android平台下UITesting环境配置
    1.androidsdk至少需要android4.1,所以先通过SDKmanager更新sdk,我这里使用android4.22.eclipse至少需要3.6.2,否则不支持3.配置环境变量path,加入java,androidsdktool的路径4.通过AVDManager启动android4.2的虚拟机5.在虚拟机上安装需要测试的apk软件(下面的测试用例只测......
  • 获得android手机的CPU核心数
    //CPU个数privateintgetNumCores(){//PrivateClasstodisplayonlyCPUdevicesinthedirectorylistingclassCpuFilterimplementsFileFilter{@Overridepublicbooleanaccept(Filepathname){//Checkiffilenameis&......
  • Android中使用log4j
    如果要直接在android工程中使用log4j,是有点问题的,会报如下的错: 11-2309:44:56.947:D/dalvikvm(1585):GC_FOR_MALLOCfreed3278objects/311568bytesin31ms rejectingopcode0x21at0x000a rejectedLorg/apache/log4j/config/PropertySetter;.getPropertyDescript......
  • Android ListView 去除…
    去除ListView滑到顶部和底部时边缘的黑色阴影:android:fadingEdge="none"----------------------------------------------------去除拖动时默认的黑色背景:android:cacheColorHint="#00000000" 或listView.setCacheColorHint(Color.TRANSPARENT);---------------------......
  • android上传图片至服务器
    本实例实现了android上传手机图片至服务器,服务器进行保存服务器servlet代码publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringtemp=request.getSession().getServle......
  • Android 开发 UI 规则
    Android的官方开发者博客发了一份幻灯片,介绍了一些AndroidUI设计的小贴士,在这里以看图说话的形式发出来。Don’t: 1、不要照搬你在其它平台的UI设计,应该让用户感觉是在真正使用一个Android软件,在你的商标显示和平台整体观感之间做好平衡2、不要过度使用模态对话框3、......
  • Android应用程序的国际化与本地化
    internationalization(国际化)简称i18n,因为在i和n之间还有18个字符,localization(本地化),简称L10n。 zh_CN,zh_TW. http://www.loc.gov/standards/iso639-2/php/code_list.phphttp://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html在Andro......