客户端(android/ios)与java服务端tomcat的gzip实现
来源:互联网 发布:诺基亚s60软件下载 编辑:程序博客网 时间:2024/06/05 12:00
开始之前我们先来简单说说gzip是干什么用的,为什么要用
我们来举个栗子
同一个请求他们使用gzip和不使用是完全两个结果
例子一:正常未通过gzip压缩的返回数据大小是100kb
例子二:添加了gzip压缩的数据的返回数据大小可能只有40-20kb甚至10kb
怎样,各位童鞋应该了解到这个gizp的作用了吧,没错,就是数据压缩。
服务端配置gzip压缩
服务端进行gzip的压缩和解压基本没什么难度,配置tomcat服务器即可
对server.xml
进行修改
<Connector connectionTimeout="20000" compression="on" compressionMinSize="50" noCompressionUserAgents="gozilla, traviata" compressableMimeType="application/json" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
compression
开启压缩 compressionMinSize
最低压缩大小,意思达到多少kb会开启压缩,默认是2048,即2kb noCompressionUserAgents
以下哪些浏览器不启用压缩 compressableMimeType
压缩的数据类型
至于对html/css/js
等等相关压缩可以在compressableMimeType
中补充,本文因为是对接口方面的压缩所以不再描述
有同学问,我既然压缩了,那就应该有解压啊!
对,没错,童鞋你的问题真多。如果你的客户端是android/ios
的话确实需要自己解压,但是如果你的客户端是浏览器的话,那么,你就不用管了,因为浏览器会帮你做这些工作,前提是你的html版本是html1.1+
(我相信现在也找不到低于这个标准的吧?)
客户端(android/ios)发送和解压gizp数据
客户端方面其实也没什么,就是需要在发送请求的时候告诉服务器,我是支持gzip压缩数据的,请你把数据压一压再给我,怎么给?
通过头文件注册
Accept-Encoding: gzip, deflate
服务器会检测你的请求是否可以使用gzip格式,如果注册了这个头文件,那么服务器自动就会进行gzip的数据压缩返回给客户端
在返回的数据结果集中response的头文件会有这么一个属性
Content-Encoding: gzip
然后客户端只需要捕抓response中的头文件是否包含这个属性,如果包含了则需要对原始数据进行解压,解压出来的就是原始数据了,具体解压代码这里给出java方面的,其他客户端可自行搜索
GZIP解压代码
package com.sspendi.framework.utils;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;/** * Gzip 压缩字符串 */public class GZIP { /** * 字符串的压缩 * * @param str 待压缩的字符串 * @return 返回压缩后的字符串 * @throws IOException */ public static String compress(String str) throws IOException { if (null == str || str.length() <= 0) { return str; } // 创建一个新的输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); // 使用默认缓冲区大小创建新的输出流 GZIPOutputStream gzip = new GZIPOutputStream(out); // 将字节写入此输出流 gzip.write(str.getBytes("utf-8")); //因为后台默认字符集有可能是GBK字符集,所以此处需指定一个字符集 gzip.close(); // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串 return out.toString("ISO-8859-1"); } /** * 字符串的解压 * * @param str 对字符串解压 * @return 返回解压缩后的字符串 * @throws IOException */ public static String unCompress(String str) throws IOException { if (null == str || str.length() <= 0) { return str; } return unCompress(str.getBytes("ISO-8859-1")); } public static String unCompress(byte[] bs) throws IOException { // 创建一个新的输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(bs); // 使用默认缓冲区大小创建新的输入流 GZIPInputStream gzip = new GZIPInputStream(in); byte[] buffer = new byte[256]; int n = 0; // 将未压缩数据读入字节数组 while ((n = gzip.read(buffer)) >= 0) { out.write(buffer, 0, n); } // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串 return out.toString("utf-8"); }}
至此,完成客户端与服务端的gzip通信,大大减少了流量。
- 客户端(android/ios)与java服务端tomcat的gzip实现
- RSA客户端(android/ios)与服务端的通信实现
- Java的oauth2.0 服务端与客户端的实现
- Java的OAuth2.0 服务端与客户端的实现
- HESSIAN 的VC++ 客户端与JAVA服务端通信 实现
- 多文件的上传 Android客户端与java服务端
- Android手机客户端通过JSP实现与Tomcat服务器端通信(Msql数据库,Json作为载体)--服务端代码
- Android实现Thrift服务端与客户端
- Java-Soket实现客户端与服务端双向通信
- java nio 实现客户端与服务端读写
- Android客户端与JAVA服务端JSON传值
- Java中利用socket实现简单的服务端与客户端的通信(入门级)
- Java中利用socket实现简单的服务端与客户端的通信(基础级)
- Android客户端与PC服务端之间的SOCKET实现登陆功能(服务器)
- 使用eclipse paho在java端实现MQTT消息的收发(客户端与服务端实例)
- java socket 实现服务端与客户端------一对多的服务端和客户机
- iOS客户端的gzip解压
- iOS客户端的gzip解压
- 基于ueditor-1.4.3.3实现图片上传到项目以外的目录下
- Maven实现直接部署Web项目到Tomcat
- Lua编程中遇到的table类型传递引用问题
- DOM节点删除之detach()和remove()区别
- SpringBoot加https的配置
- 客户端(android/ios)与java服务端tomcat的gzip实现
- 回溯算法解八皇后问题(java版)
- ceph perf counter 源码分析及使用
- 利用游标更新字段值
- oracle 线上环境创建用户、表空间、授权
- 在Spring Boot框架下使用WebSocket实现聊天功能
- BZOJ2160 拉拉队排练 解题报告【字符串】【Manacher】【差分】
- hdu 2119 最小顶点能覆盖
- 首博