最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs關(guān)于gzip/deflate壓縮詳解

 更新時(shí)間:2015年03月04日 10:48:32   投稿:hebedich  
本文主要向大家介紹了nodejs中關(guān)于gzip/deflate壓縮的2種方法,分別是管道壓縮和非管道壓縮,十分詳細(xì),并附帶示例,這里推薦給大家參考下。

0x01.關(guān)于

寫http時(shí)候,在接收http請(qǐng)求時(shí)候,出現(xiàn)亂碼,后來發(fā)現(xiàn)是gzip沒有解壓。

關(guān)于gzip/deflate壓縮,有放入管道壓縮,和非管道壓縮方法。

0x02.管道壓縮

Node中的I/O是異步的,因此對(duì)磁盤和網(wǎng)絡(luò)的讀寫需要通過回調(diào)函數(shù)來讀取數(shù)據(jù)。

當(dāng)內(nèi)存中無法一次裝下需要處理的數(shù)據(jù)時(shí),或者一邊讀取一邊處理更加高效時(shí),我們就需要用到數(shù)據(jù)流。

NodeJS中通過各種Stream來提供對(duì)數(shù)據(jù)流的操作。

官網(wǎng)提供了管道方法:

復(fù)制代碼 代碼如下:

// client request example
var zlib = require('zlib');
var http = require('http');
var fs = require('fs');
var request = http.get({ host: 'homeway.me',
                     path: '/',
                     port: 80,
                     headers: { 'accept-encoding': 'gzip,deflate' } });
request.on('response', function(response) {
    var output = fs.createWriteStream('izs.me_index.html');
    switch (response.headers['content-encoding']) {
        // or, just use zlib.createUnzip() to handle both cases
        case 'gzip':
            response.pipe(zlib.createGunzip()).pipe(output);
            break;
        case 'deflate':
            response.pipe(zlib.createInflate()).pipe(output);
            break;
        default:
            response.pipe(output);
            break;
    }
});

0x03.非管道壓縮

代碼如下:

復(fù)制代碼 代碼如下:

#! /usr/local/bin/node
var http = require('http'),
    querystring = require('querystring'),
    zlib = require('zlib');
var args = {
    //參數(shù)以及備用數(shù)據(jù)
    contents : querystring.stringify({ 
        //發(fā)包的信息
        name:'homeway.me',
    }),
};
var options = {
    hostname: 'homeway.me',
    port: 80,
    path: '/',
    method: 'GET',
    headers: {
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Content-Length': args.contents.length,
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.11 Safari/537.36',
        'Accept-Encoding':'gzip, deflate',
   },
};
var get = function ( options, args, callback ){
    var req = http.request(options, function (res) {
        var chunks =[], data, encoding = res.headers['content-encoding'];
        // 非gzip/deflate要轉(zhuǎn)成utf-8格式
        if( encoding === 'undefined'){
            res.setEncoding('utf-8');
        }
        res.on('data', function (chunk){
            chunks.push(chunk);
        });
        res.on('end', function (){
            var buffer = Buffer.concat(chunks);
            if (encoding == 'gzip') {
                zlib.gunzip(buffer, function (err, decoded) {
                    data = decoded.toString();
                    callback( err, args, res.headers, data);
                });
            } else if (encoding == 'deflate') {
                zlib.inflate(buffer, function (err, decoded) {
                    data = decoded.toString();
                    callback( err, args, res.headers, data);
                });
            } else {
                data = buffer.toString();
                callback( null, args, res.headers, data);
            }
        });
    });
    req.write( args.contents );
    req.end();
};
get( options, args, function (err, args, headers, data){
    console.log('==>header \n', headers);
    console.log('==data \n', data);
});

以上就是Nodejs關(guān)于gzip/deflate壓縮的全部內(nèi)容了,希望大家能夠喜歡。

相關(guān)文章

最新評(píng)論

崇左市| 哈巴河县| 吴川市| 安乡县| 保靖县| 军事| 桂东县| 白河县| 浪卡子县| 噶尔县| 湘阴县| 大悟县| 新津县| 宜兰县| 溧水县| 广平县| 公安县| 锡林郭勒盟| 正镶白旗| 黄冈市| 习水县| 元谋县| 观塘区| 新晃| 海城市| 静海县| 永吉县| 木里| 宜君县| 成安县| 蓬安县| 罗山县| 岑溪市| 团风县| 松桃| 宁陵县| 杨浦区| 壤塘县| 海伦市| 陇川县| 鄂托克旗|