亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

NodeJS Stream的雙工流

2024-04-27 15:13:11
字體:
來源:轉載
供稿:網友

雙工流就是同時實現了 Readable 和 Writable 的流,即可以作為上游生產數據,又可以作為下游消費數據,這樣可以處于數據流動管道的中間部分,即

rs.pipe(rws1).pipe(rws2).pipe(rws3).pipe(ws);

在 NodeJS 中雙工流常用的有兩種

DuplexTransform

Duplex

實現 Duplex

和 Readable、Writable 實現方法類似,實現 Duplex 流非常簡單,但 Duplex 同時實現了 Readable 和 Writable, NodeJS 不支持多繼承,所以我們需要繼承 Duplex 類

繼承 Duplex 類實現 _read() 方法實現 _write() 方法

相信大家對 read()、write() 方法的實現不會陌生,因為和 Readable、Writable 完全一樣。

const Duplex = require('stream').Duplex;const myDuplex = new Duplex({ read(size) { // ... }, write(chunk, encoding, callback) { // ... }});

構造函數參數

Duplex 實例內同時包含可讀流和可寫流,在實例化 Duplex 類的時候可以傳遞幾個參數

readableObjectMode : 可讀流是否設置為 ObjectMode,默認 falsewritableObjectMode : 可寫流是否設置為 ObjectMode,默認 falseallowHalfOpen : 默認 true, 設置成 false 的話,當寫入端結束的時,流會自動的結束讀取端,反之亦然。

小例子

了解了 Readable 和 Writable 之后看 Duplex 非常簡單,直接用一個官網的例子

const Duplex = require('stream').Duplex;const kSource = Symbol('source');class MyDuplex extends Duplex { constructor(source, options) { super(options); this[kSource] = source; } _write(chunk, encoding, callback) { // The underlying source only deals with strings if (Buffer.isBuffer(chunk)) chunk = chunk.toString(); this[kSource].writeSomeData(chunk); callback(); } _read(size) { this[kSource].fetchSomeData(size, (data, encoding) => { this.push(Buffer.from(data, encoding)); }); }}

當然這是不能執行的偽代碼,但是 Duplex 的作用可見一斑,進可以生產數據,又可以消費數據,所以才可以處于數據流動管道的中間環節,常見的 Duplex 流有

Tcp ScoketZlibCrypto

Transform

Transform 同樣是雙工流,看起來和 Duplex 重復了,但兩者有一個重要的區別:Duplex 雖然同事具備可讀流和可寫流,但兩者是相對獨立的;Transform 的可讀流的數據會經過一定的處理過程自動進入可寫流。

雖然會從可讀流進入可寫流,但并不意味這兩者的數據量相同,上面說的一定的處理邏輯會決定如果 tranform 可讀流,然后放入可寫流,transform 原義即為轉變,很貼切的描述了 Transform 流作用。

我們最常見的壓縮、解壓縮用的 zlib 即為 Transform 流,壓縮、解壓前后的數據量明顯不同,兒流的作用就是輸入一個 zip 包,輸入一個解壓文件或反過來。我們平時用的大部分雙工流都是 Transform。

實現 Tranform

Tranform 類內部繼承了 Duplex 并實現了 writable.write() 和 readable._read() 方法,我們想自定義一個 Transform 流,只需要

繼承 Transform 類實現 _transform() 方法實現 _flush() 方法(可以不實現)

_transform(chunk, encoding, callback) 方法用來接收數據,并產生輸出,參數我們已經很熟悉了,和 Writable 一樣, chunk 默認是 Buffer,除非 decodeStrings 被設置為 false。

在 _transform() 方法內部可以調用 this.push(data) 生產數據,交給可寫流,也可以不調用,意味著輸入不會產生輸出。

當數據處理完了必須調用 callback(err, data) ,第一個參數用于傳遞錯誤信息,第二個參數可以省略,如果被傳入了,效果和 this.push(data) 一樣

transform.PRototype._transform = function (data, encoding, callback) { this.push(data); callback();};transform.prototype._transform = function (data, encoding, callback) { callback(null, data);};

有些時候,transform 操作可能需要在流的最后多寫入可寫流一些數據。例如, Zlib流會存儲一些內部狀態,以便優化壓縮輸出。在這種情況下,可以使用_flush()方法,它會在所有寫入數據被消費、觸發 'end'之前被調用。

Transform 事件

Transform 流有兩個常用的事件

來自 Writable 的 finish來自 Readable 的 end

當調用 transform.end() 并且數據被 _transform() 處理完后會觸發 finish,調用_flush后,所有的數據輸出完畢,觸發end事件。

對比

了解了 Readable 和 Writable 之后,理解雙工流十分自然,但兩者的區別會讓一些初學者困惑,簡單的區分:Duplex 的可讀流和可寫流之間并沒有直接關系,Transform 中可讀流的數據會經過處理后自動放入可寫流中。

看兩個簡單的例子就能直觀了解到 Duplex 和 Transform 的區別

TCP socket

net 模塊可以用來創建 socket,socket 在 NodeJS 中是一個典型的 Duplex,看一個 TCP 客戶端的例子

var net = require('net');//創建客戶端var client = net.connect({port: 1234}, function() { console.log('已連接到服務器'); client.write('Hi!');});//data事件監聽。收到數據后,斷開連接client.on('data', function(data) { console.log(data.toString()); client.end();});//end事件監聽,斷開連接時會被觸發client.on('end', function() { console.log('已與服務器斷開連接');});

可以看到 client 就是一個 Duplex,可寫流用于向服務器發送消息,可讀流用于接受服務器消息,兩個流內的數據并沒有直接的關系。

gulp

gulp 非常擅長處理代碼本地構建流程,看一段官網的示例代碼

gulp.src('client/templates/*.jade') .pipe(jade()) .pipe(minify()) .pipe(gulp.dest('build/minified_templates'));

其中 jada() 和 minify() 就是典型的 Transform,處理流程大概是

.jade 模板文件 -> jada() -> html 文件 -> minify -> 壓縮后的 html

可以看出來,jade() 和 minify() 都是對輸入數據做了些特殊處理,然后交給了輸出數據。

這樣簡單的對比就能看出 Duplex 和 Transform 的區別,在平時實用的時候,當一個流同事面向生產者和消費者服務的時候我們會選擇 Duplex,當只是對數據做一些轉換工作的時候我們便會選擇使用 Tranform。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线视频一区二区| 色噜噜狠狠色综合网图区| 亚洲国产成人久久综合| 欧美激情xxxx| 色爱av美腿丝袜综合粉嫩av| 色樱桃影院亚洲精品影院| 在线日韩中文字幕| 亚洲aⅴ男人的天堂在线观看| 国产亚洲成精品久久| 久久久久久国产精品久久| 麻豆国产va免费精品高清在线| 国产91亚洲精品| 欧美日韩精品在线| 热re99久久精品国产66热| 国产在线视频2019最新视频| 欧美色播在线播放| 国产v综合ⅴ日韩v欧美大片| 日韩视频免费在线| 精品动漫一区二区三区| 国产一区二区视频在线观看| 亚洲国产成人久久| 伊人久久久久久久久久久| 中文字幕av日韩| 国产97在线播放| 亚洲缚视频在线观看| 欧洲s码亚洲m码精品一区| 国产精品欧美久久久| 亚洲成人三级在线| 青青久久av北条麻妃海外网| 国产不卡av在线免费观看| 亚洲新声在线观看| 欧美尺度大的性做爰视频| 国产欧美精品久久久| 在线播放精品一区二区三区| 91精品综合久久久久久五月天| 在线视频中文亚洲| 欧美丰满片xxx777| **欧美日韩vr在线| 成人性生交大片免费看视频直播| 成人乱人伦精品视频在线观看| 欧美精品在线播放| 久久国产天堂福利天堂| 国产91色在线|免| 日韩经典中文字幕在线观看| 国产精品一区二区三区毛片淫片| 成人精品在线视频| 午夜精品一区二区三区视频免费看| 亚洲嫩模很污视频| 精品国产户外野外| 中文字幕亚洲欧美日韩高清| 久久久久久91| 国产丝袜视频一区| 欧美久久精品一级黑人c片| 尤物yw午夜国产精品视频| 正在播放欧美视频| 久久久久久久国产| 中文字幕精品网| 日韩免费在线看| 亚洲一区二区三区乱码aⅴ| 亚洲第一区中文99精品| 久久久久久国产精品美女| 亚洲免费人成在线视频观看| 亚洲国产又黄又爽女人高潮的| 26uuu亚洲国产精品| 国产成人精品一区二区三区| 日韩在线免费观看视频| 久久夜色精品亚洲噜噜国产mv| 日韩精品视频在线观看网址| 欧美日韩精品在线播放| 97人洗澡人人免费公开视频碰碰碰| 国产精品v片在线观看不卡| 国产精欧美一区二区三区| 国产精品久久久久久久久久ktv| 日本成人精品在线| 国产精品爽爽爽爽爽爽在线观看| 久久精品影视伊人网| 久久久久国产视频| 精品伊人久久97| 亚洲国产中文字幕在线观看| 国产精品成人va在线观看| 欧美色欧美亚洲高清在线视频| 亚洲国产一区二区三区四区| 亚洲女人被黑人巨大进入al| 高清欧美性猛交xxxx黑人猛交| 欧美日韩国产中字| 日韩一区二区精品视频| 亚洲天堂av综合网| 亚洲国产精品女人久久久| 国产一区二中文字幕在线看| 国产成人精品最新| 中文字幕综合一区| 欧美极品欧美精品欧美视频| 18性欧美xxxⅹ性满足| 91在线精品播放| 久久久久久伊人| 亚洲日本成人女熟在线观看| 亚洲欧美激情精品一区二区| 亚洲精品99久久久久中文字幕| 精品女同一区二区三区在线播放| 日本久久久久亚洲中字幕| 69影院欧美专区视频| 欧美在线www| 91免费电影网站| 日韩av电影中文字幕| 欧美电影在线观看高清| 亚洲国产古装精品网站| 国产精品电影久久久久电影网| 中文综合在线观看| 国产欧美日韩最新| 亚洲激情在线视频| 亚洲精品视频网上网址在线观看| 国产亚洲成精品久久| 日韩在线视频免费观看高清中文| 国产精品你懂得| 久久久久久国产精品美女| 国产精品都在这里| 亚洲欧美日韩天堂一区二区| 国产999精品| 欧美黄色www| 国产成人亚洲综合91精品| 精品日本美女福利在线观看| 亚洲www在线观看| 韩日欧美一区二区| 久久精品国产免费观看| 日韩av电影在线免费播放| 精品欧美aⅴ在线网站| 亚洲欧美变态国产另类| 亚洲天堂一区二区三区| 亚洲在线观看视频网站| 国产精品igao视频| 亚洲精品电影在线观看| 日韩av在线免费观看| 欧美成人激情图片网| 日本成人激情视频| 国产精品电影久久久久电影网| 日本sm极度另类视频| 欧美激情奇米色| 欧美日韩国产中文字幕| 久久精品国产视频| 热re91久久精品国99热蜜臀| 久久精品91久久久久久再现| 欧美夫妻性视频| 在线看福利67194| 亚洲国产精品热久久| 国产剧情日韩欧美| 亚洲毛片在线免费观看| xxxxx成人.com| 亚洲精品99久久久久中文字幕| 亚洲精品在线91| 欧美成人高清视频| 亚洲91精品在线观看| 欧美裸体xxxx极品少妇软件| 国内精品一区二区三区| 日韩一区二区久久久| 精品国内自产拍在线观看| 国产精品久久久久久久av大片| 精品国内亚洲在观看18黄| 欧美午夜精品久久久久久久| zzjj国产精品一区二区| 日韩视频中文字幕| 亚洲第一区第二区| 菠萝蜜影院一区二区免费| 久久亚洲一区二区三区四区五区高| 精品国产一区二区三区在线观看|