现如今在处理http请求的时候,由于请求的资源较多,如果不启用压缩的话,那么页面请求的流量将会非常大。启用gzip压缩,在一定程度上会大大的提高页面性能。

因此这写一个使用Node.js实现在http客户端与服务端传输压缩数据的实例代码。在HTTP服务器端与HTTP客户端之间传输压缩数据时,在客户端请求头中需要使用accept-encoding字段指定服务端压缩数据时使用的压缩算法,在服务端响应头中使用content-encoding字段声明服务器端响应数据的压缩算法。
首先来看服务端代码吧,这段代码,首先创建了一个HTTP服务器,当HTTP服务器接收到客户端请求时,获取客户端请求头中的accept-encoding字段,如果字段值包含'deflate'字段,创建Deflate对象并使用该对象压缩应用程序根目录下的test.txt文件,在服务器端响应头中使用content-encoding字段值指定为'deflate',然后将压缩后的数据返回给客户端。如果accept-encoding字段值包含'gzip'字符串,使用同样的方式来创建一个Gzip对象来压缩应用程序根目录下的test.txt文件,在服务器端响应头中使用content-encoding字段值指定为'gzip',然后将压缩后的数据返回给客户端。如果accept-encoding字段值中不包含上述两种字符串,则直接将应用程序根目录下的test.txt文件中的数据返回给客户端。
 
完整的server代码如下:
var fs = require('fs');
var zlib = require('zlib');
var http = require('http'); http.createServer(function (req, res){
var raw = fs.createReadStream('test.txt');
var acceptEncoding = req.headers['accept-encoding'];
if (!acceptEncoding){
acceptEncoding = '';
} if (acceptEncoding.match(/\bdeflate\b/)){
res.write(200, {'content-encoding': 'deflate'});
raw.pipe(zlib.createDeflate()).pipe(res);
} else if (acceptEncoding.match(/\bgzip\b/)){
res.write(200, {'content-encoding': 'gzip'});
raw.pipe(zlib.createGzip()).pipe(res);
} else{
res.write(200, {});
raw.pipe(res);
}
}).listen(1337, '127.0.0.1');
创建了服务端之后,我们来看看创建的HTTP客户端,在下面的客户端实例代码中我们创建了一个HTTP客户端请求数据,将客户端请求头重的accept-encoding字段值设定为‘gzip, deflate',在接受到客户端请求后,获取响应头中的content-encoding字段值,如果字段值为’gzip',创建Gunzip对象并使用该对象解压缩服务端响应数据,并将其写入到应用程序根目录下的test1.txt文件中。如果content-encoding字段值为'deflate',创建Inflate对象并使用对象解压缩服务端响应数据,并将其写入到应用程序根目录下的test1.txt文件中。如果content-encoding字段值不包含上述两个字符串,则会将服务端相应的数据直接写入应用程序根目录下的test1.txt文件中。
 
完整的client代码如下:
var fs = require('fs');
var zlib = require('zlib');
var http = require('http'); var options = {
host: 'localhost',
path: '/',
port: 1337,
headers: {'accept-encoding': 'gzip, deflate'}
}; var request = http.get(options) ;
request.on('response', function (res){
var output = fs.createWriteStream('test2.txt'); var codeStr = res.headers['content-encoding'];
switch (codeStr){
case 'gzip':
res.pipe(zlib.createGunzip()).pipe(output);
break;
case 'deflate':
res.pipe(zlib.createInflate()).pipe(output);
break;
default :
res.pipe(output);
break
} });

使用zlib模块实现HTTP服务端与客户端实现传输数据压缩的更多相关文章

  1. Socket服务端和客户端文件传输

    很多朋友在使用socket编程时不可避免的都做过文件传输,而视频电影等需要一个字节一个字节的传输:但是客户端一般都通过-1进行终止,服务也一样:但是存在的问题是客户端永远不会把-1传递给服务端:因此经 ...

  2. Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  3. Centos6.9 搭建rsync服务端与客户端 案例:全网备份项目

    rsync的企业工作场景说明 1)定时备份 1.1生产场景集群架构服务器备份方案项目 借助cron+rsync把所有客户服务器数据同步到备份服务器 2)实时复制 本地数据传输模式(local-only ...

  4. seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案

    seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案 说明: 之所以只用nacos进行了注册与发现,因为seata使用naco ...

  5. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

  6. python thrift 服务端与客户端使用

    一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...

  7. IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案

    上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...

  8. 如何排查APP服务端和客户端是否支持ATS

    服务端排查 取得客户端直接连接的服务端域名及端口,例如mob.com.cn,端口443,即HTTPS默认端口.针对公网可访问的生产环境地址,建议使用的在线监测工具.https://wosign.ssl ...

  9. (转)SVN 服务端、客户端安装及配置、导入导出项目

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

随机推荐

  1. ssl 复制

    http://www.ttlsa.com/mysql/mysql-replication-base-on-ssl/ http://www.tuicool.com/articles/mi2iaq htt ...

  2. 理解JavaScript中的事件流

    原文地址:http://my.oschina.net/sevenhdu/blog/332014 目录[-] 事件冒泡 事件捕获 DOM事件流 当浏览器发展到第四代时(IE4和Netscape Comm ...

  3. jQuery EasyUI 数据网格 - 条件设置行背景颜色

    $('#tt').datagrid({ rowStyler:function(index,row){ if (row.listprice>50){ return 'color:blue;font ...

  4. Labeled Faces in the Wild 人脸识别数据集 部分训练数据

    development training set Note: images displayed are original (non-aligned/funneled) images. match pa ...

  5. ContextLoaderListener 与 ServletDispatcher

    网上找了一下关于ContextLoaderListener和ServletDispatcher的解释,这是原文 http://simone-folino.blogspot.com/2012/05/di ...

  6. 比較不错的一个ios找茬游戏源代码

    找茬游戏源代码 .这个是一款很不错的ios找茬游戏源代码,该游戏的兼容性很好的.并且还能够支持ipad和iphone.UI界面设计得也很美丽,游戏源代码真的是一款很完美.并且又很完整的一款休闲类的游戏 ...

  7. go语言基础之字符串类型 和 字符与字符串类型的区别

    1.字符串类型 示例1: package main //必须有一个main包 import "fmt" func main() { var str1 string str1 = & ...

  8. SQL insert失败时也会造成自增长字段加1

    CREATE TABLE #test(id INT IDENTITY(1,1), NAME varchar(30)) INSERT #test(name)SELECT '41545' SELECT   ...

  9. SSH ProxyCommand 实践

    ​ 在阿里上搭了典型的 Nginx + APP server 的架构: 即,只有 Nginx 服务器与公网链接.然后,每次部署升级服务器都要先 SSH 到 Nginx 再 SSH 到 server1 ...

  10. PHP 杂项函数

    PHP 杂项 函数 PHP 杂项函数简介 我们把不属于其他类别的函数归纳到杂项函数类别. 安装 杂项函数是 PHP 核心的组成部分.无需安装即可使用这些函数. Runtime 配置 杂项函数的行为受 ...