android与服务端通讯时使用到的GZIP压缩及解压
为了减小android项目与服务端进行通讯时的数据流量,我们可以使用GZIP对服务端传输的数据进行压缩,在android客户端解压。或在客户端压缩,在服务端解压。代码如下:
android客户端的GZIP操作类:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream; import org.kobjects.base64.Base64; /**
* @author Jinqi 2014/1/27
* GZIP压缩和解压缩的操作类
*
*/
public class GzipHelper {
/** GZIP压缩
* @param str 要压缩的字符串
* @return GZIP压缩后的字符串
* @throws IOException
*/
public static String compress(String str) throws IOException { byte[] blockcopy = ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(str.length())
.array();
ByteArrayOutputStream os = new ByteArrayOutputStream(str.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(str.getBytes());
gos.close();
os.close();
byte[] compressed = new byte[4 + os.toByteArray().length];
System.arraycopy(blockcopy, 0, compressed, 0, 4);
System.arraycopy(os.toByteArray(), 0, compressed, 4,
os.toByteArray().length);
return Base64.encode(compressed); } /** GZIP解压缩
* @param zipText GZIP压缩过的字符串
* @return 解压后的字符串
* @throws IOException
*/
public static String decompress(String zipText) throws IOException {
byte[] compressed = Base64.decode(zipText);
if (compressed.length > 4)
{
GZIPInputStream gzipInputStream = new GZIPInputStream(
new ByteArrayInputStream(compressed, 4,
compressed.length - 4)); ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int value = 0; value != -1;) {
value = gzipInputStream.read();
if (value != -1) {
baos.write(value);
}
}
gzipInputStream.close();
baos.close();
String sReturn = new String(baos.toByteArray(), "UTF-8");
return sReturn;
}
else
{
return "";
}
}
}
.net服务端的GZIP操作类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.IO;
using System.IO.Compression; namespace MobileServ
{
public class ZipHelper
{
public static string compress(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, , buffer.Length);
} ms.Position = ;
MemoryStream outStream = new MemoryStream(); byte[] compressed = new byte[ms.Length];
ms.Read(compressed, , compressed.Length); byte[] gzBuffer = new byte[compressed.Length + ];
System.Buffer.BlockCopy(compressed, , gzBuffer, , compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), , gzBuffer, , );
return Convert.ToBase64String(gzBuffer);
} public static string decompress(string compressedText)
{
byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, );
ms.Write(gzBuffer, , gzBuffer.Length - ); byte[] buffer = new byte[msgLength]; ms.Position = ;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
{
zip.Read(buffer, , buffer.Length);
} return Encoding.UTF8.GetString(buffer);
}
}
}
}
通过GIZP压缩及解压,可以将传输的数据压缩1/4左右,效果非常明显。
android与服务端通讯时使用到的GZIP压缩及解压的更多相关文章
- Android从服务端获取json解析显示在客户端上面
Android从服务端获取json解析显示在客户端上面 百度经验:jingyan.baidu.com 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Jso ...
- 服务端渲染时无法获得环境变量的值,一直是undefined
1.服务端渲染时无法获得环境变量的值,一直是undefined 2.ngnix做代理以后无法无法获取node设置的cookie
- Android 打造自己的个性化应用(五):仿墨迹天气实现续--> 使用Ant实现zip/tar的压缩与解压
上一篇中提到对于Zip包的解压和压缩需要借助Ant 实现,我经过参考了其他的资料,整理后并加上了一些自己的看法: 这里就具体地讲下如何使用Ant进行解压缩及其原因: java中实际是提供了对 zip ...
- webservice调用服务端数据时给soapenv:Envelope 添加自定义的命名空间
最近做第三方接口,服务端需要 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/&qu ...
- Android 解决服务端验证码问题
服务端验证码解决方法. 在服务端生成验证码后会把验证码字符串存在服务端的session中,等待用户提交进行比对.为了保证服务器与客户端的一对一的关系,所以出现了session 和cookie技术.客户 ...
- Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
设计思路 使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能. Java服务端设计 packag ...
- FastSocket客户端/服务端通讯示例
新建控制台项目,命名为Server 添加FastSocket.SocketBase,FastSocket.Server引用 Socket命令服务类: Sodao.FastSocket.Server ...
- FastSocket客户端/服务端通讯示例 客户端被动接收
示例代码参见 http://www.cnblogs.com/T-MAC/p/fastsocket-asyncbinary-usage.html 我这里只写一份客户端如何被动接收的代码. 先从As ...
- 3、netty第二个例子,使用netty建立客户端,与服务端通讯
第一个例子中,建立了http的服务器端,可以直接使用curl命令,或者浏览器直接访问. 在第二个例子中,建立一个netty的客户端来主动发送请求,模拟浏览器发送请求. 这里先启动服务端,再启动客户端, ...
随机推荐
- (转) HA的几种方案
数据库HA 一般把数据库层面的HA,和应用层面HA分开考虑 数据库一般采用数据库产品提供的HA方案,比如Oracle的RAC,mysql的集群,mongodb的replica set等 无HA的运 ...
- 解决vscode按下ctrl+S的时候自动格式化
按下ctrl+S的时候自动格式化 为什么需要这种操作? 优点: 保存的时候格式化,让我们的代码自动格式化,减少人工调整. 缺点: 有一些打好包的JS有时候修改一下,但不需要格式化,因为打好包就是要压缩 ...
- shell脚本--字符串处理和动态数组
Linux下的文本处理命令,以清晰的列分割数据为高效处理源: awk 的gsub函数可替换指定字符串 echo "<tr><td>col1</td>< ...
- 【POJ 2409】Let it Bead
http://poj.org/problem?id=2409 Burnside引理:设\(G\)是\(X\)的置换群,而\(\mathcal{C}\)是\(X\)中一个满足下面条件的着色集合:对于\( ...
- 插头dp练习
最近学了插头dp,准备陆续更新插头dp类练习. 学习论文还是cdq那篇<基于连通性状态压缩的动态规划问题>. 基本的想法都讲得很通透了,接下来就靠自己yy了. 还有感谢kuangbin大大 ...
- 【线段树】I Hate It
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- BZOJ 2430 [Poi2003]Chocolate(贪心+归并排序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2430 [题目大意] 有一块n*m的矩形巧克力,准备将它切成n*m块. 巧克力上共有n- ...
- Problem F: 零起点学算法101——统计字母数字等个数
#include<stdio.h> #include<string.h> int main(){ ]; while(gets(str)!=NULL){ ,b=,c=,d=; ; ...
- Java高级架构师(一)第39节:Nginx的Rewrite模块
- 手Q游戏中心上线 完美释放娱乐基因
今年A股市场上手游概念股的表现可谓“独当一面”,不少和手游沾边的公司股价都翻了倍.在笔者看来,这些手游企业的股价明显高得离谱,这轮行情可以证明资本市场对手游的关注度非常高,但并不意味着这些手游 ...