现如今在处理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. ListVIew点击事件失效

    转自:http://blog.csdn.net/zhufuing/article/details/8677407 记录下自己所犯的错误,在写ListView的点击事件时OnItemClickListe ...

  2. thymleaf th:if标签

    1.概念 <table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOC ...

  3. Liunx下文件权限详解

    刚接触Linux时对Linux下的文件权限的概念一直很模糊,观念还一直停留在windows下,所以有很多操作一直提示权限不够.为了弄懂文件权限问题我查找了很多资料整理如下,我把这些学习笔记贴出来和大家 ...

  4. java 中函数的参数传递详细介绍

    java中函数的参数传递 总结: 1.将对象(对象的引用)作为参数传递时传递的是引用(相当于指针).也就是说函数内对参数所做的修改会影响原来的对象.  2.当将基本类型或基本类型的包装集作为参数传递时 ...

  5. go语言基础之局部变量特点

    1.局部变量特点 示例1: package main import "fmt" func main() { //定义在{}里面的变量就是局部变量,只能在{}里面有效 //执行到定义 ...

  6. C#-MessageBox全部函数重载形式及举例

    Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  7. 关于vs2013调试的偶然错误发现与总结(vs2013的承载进程)---ShinePans

    当项目的属性选择为 启用 vs2013承载进程 或出现一下错误: 尝试运行项目时出错:未能加载文件或程序集"GroupBoxTest" 或它的某一个依赖项.给定程序集名称" ...

  8. 【转】 Python 中,matplotlib绘图无法显示中文的问题

    在python中,默认情况下是无法显示中文的,如下代码: import matplotlib.pyplot as plt # 定义文本框和箭头格式 decisionNode = dict(boxsty ...

  9. IIS7 大文件上传 asp.net iis配置

    IS6下上传大文件没有问题,但是迁移到IIS7下面,上传大文件时,出现HTTP 404错误. IIS配置上传大小,webconfig <!-- 配置允许上传大小 --><httpRu ...

  10. uva:10487 - Closest Sums(二分查找)

    题目:10487 - Closest Sums 题目大意:给出一组数据,再给出m个查询的数字. 要求找到这组数据里的两个数据相加的和最靠近这个查询的数据,输出那两个数据的和. 解题思路:二分查找.这样 ...