GZIP是一个将压缩技术使用到HTTP上的技术,说起来很简单,就是让服务器将文件内容压缩并发给浏览器,浏览器接受之后先解压再用来解析,在这种情况下,节省网络流量开支,浏览器传送的文本是很多的,而文本压缩通常都可以到原来文件的20%,而且GZIP技术目前主流的浏览器都是支持的,这是一个通过消耗服务器性能来节省流量的模式。
不过在我的使用之中,并没有消耗服务器性能,而直接节省流量,因为我在使用的时候,文件在缓存的时候就直接使用GZIP格式来存放了,因此在客户端请求该文件的时候,我不需要先压缩再传送,而是直接传送,相对来讲,甚至还提高了服务器的性能。
我使用的时候,在缓存文件生成的时候,将文本直接压缩为GZIP格式来保存,这样的话,我的缓存文件大小由原来的15K左右变为2-3K,大大的节省了网站的空间,当用户访问该文件的时候,我进行判断,如果浏览器是支持GZIP的,我就直接将缓存文件的字节流返回到浏览器,如果浏览器不支持(这种可能性相当低),我反而需要将该文件解压,将解压后的字节流返回到客户端。
以上可以看出,我确实节省了网站的空间和流量,而且因为现在的浏览器95%以上(保守估计,因为我没有听说哪个不支持)都是支持GZIP的,实际上网站的服务端性能反而有提升,这叫有百利而五一害。
如何判断浏览器是否支持GZIP呢?浏览器在发送HTTP请求的时候,会有一个HEAD字段叫Accept-Encoding,代表浏览器支持的返回编码格式,通常为以下值(deflate代表明文):
Accept-Encoding: gzip, deflate
浏览器又如何判断服务端返回的数据是明文还是GZIP格式的呢?也是通过服务端的HEAD字段,例如:
Content-Encoding: gzip
如果该值不是GZIP,则代表为明文,而且,该字段同时也可能代表文本文件的编码,例如utf-8
以下是我具体使用GZIP的做法,首先是缓存的写入过程:
FileStream fileStream=File.Create(path);//创建缓存文件
Stream writer=new GZipOutputStream(fileStream);//将缓存文件流使用GZIP来写入
XsltArgumentList list=new XsltArgumentList();//我的网站是使用XML+XSLT来生成页面的
xslt.Transform(xml,list,writer,null);//将XSLT生成的内容传递到GZIP压缩程序
writer.Close();//完成写入
fileStream.Close();//关闭文件句秉
其次是读取缓存的过程:
if(acceptEncoding!=null && acceptEncoding.IndexOf("gzip")>=0)//通过请求的http head来判断是否支持GZIP
{//如果支持GZIP,返回gzip格式
Response.AddHeader("Content-Encoding","gzip");//通知浏览器该文件是GZIP压缩过的文件
Response.TransmitFile(path);//直接将该文件返回
}
else
{//返回明文格式,这种情况下我们要从ZIP文件之中解压缩出文件内容,不需要发送Content-Encoding Head,因为默认就是明文的
Stream reader=new GZipInputStream(File.OpenRead(path));//打开该文件
byte[] buffer=new byte[1024];//建立文件读取缓存
int p;
while((p=reader.Read(buffer,0,1024))>0)//每次读取到相应的缓存就返回内容
{
Response.OutputStream.Write(buffer,0,p);
Response.Flush();
}
}
以上就是我的实现全过程,因为我是使用XML+XSLT来实现页面的,因此使用该技术的时候显得很顺畅,而对于通过页面ASPX,JSP等技术来返回的用户可能就有一些麻烦了。
分
文章来源:http://www.cnblogs.com/analyzer/articles/1273964.html
分享到:
相关推荐
### 30种Java技术框架概述 #### 一、Java类加载器架构 Java类加载器是Java虚拟机(JVM)的重要组成部分之一,主要负责在程序运行时将类文件加载到内存中,并对其进行验证、准备和解析等初始化操作。类加载器采用双亲...
Java技术介绍论文.pdf
《SOA与Java:用Java技术实现面向服务》的几位作者都是业界的领袖,ThomasErl更是SOA领域的领军,本书详细的介绍了使用Java技术实现SOA的方法,对于想要学习SOA的Java程序员,以及想要使用Java实现设计的SOA从业者...
Java技术精髓Java技术精髓Java技术精髓Java技术精髓Java技术精髓Java技术精髓Java技术精髓
Java技术资料书籍
Java技术,作为一门广泛使用的编程语言,由James Gosling、Mike Sheridan和Patrick Naughton在1991年6月启动开发。最初,Java被设计用于互动电视,但由于当时数字有线电视行业的发展水平,这一目标并未实现。项目...
java技术教程基础篇java技术教程基础篇
java 技术分析.txt
尚硅谷Java技术之高频面试题-v6.0
java技术体系和学习提纲 是我们PM整理的,还不错。
Java技术学习路线图--描述如何一步一步学习Java,每一步该学习什么内容等等
Java平台及应用Java技术的安全问题研究,关于这方面的可以一看
这是本人积累多年的Java技术资料,大部分是在各个项目期间,遇到难题或者技术瓶颈时,查阅网上或者书上的资料保留下来的,当作积累保存,如果大家觉得可以,以后会多多上传,希望这些对于大家能有所帮助;...
java技术栈.xmind
Java技术:Java程序设计及应用.pdf
与java相关的演讲ppt,简单的介绍java的简单知识
Java技术的介绍与如何运用,仅供参考:下来看看吧
java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...
JAVA技术合集(本人总结CHM)
Java技术教程.基础篇,介绍java的基础知识