精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node.js中的stream模塊詳解

開發 前端
stream不是node.js獨有的概念,而是一個操作系統最基本的操作方式,只不過node.js有API支持這種操作方式。linux命令的|就是stream。

什么是stream

定義

流的英文stream,流(Stream)是一個抽象的數據接口,Node.js中很多對象都實現了流,流是EventEmitter對象的一個實例,總之它是會冒數據(以 Buffer 為單位),或者能夠吸收數據的東西,它的本質就是讓數據流動起來。可能看一張圖會更直觀:

水桶管道流轉圖

注意:stream不是node.js獨有的概念,而是一個操作系統最基本的操作方式,只不過node.js有API支持這種操作方式。linux命令的|就是stream。

為什么要學習stream

視頻播放例子

小伙伴們肯定都在線看過電影,對比定義中的圖-水桶管道流轉圖,source就是服務器端的視頻,dest就是你自己的播放器(或者瀏覽器中的flash和h5 video)。大家想一下,看電影的方式就如同上面的圖管道換水一樣,一點點從服務端將視頻流動到本地播放器,一邊流動一邊播放,最后流動完了也就播放完了。

說明:視頻播放的這個例子,如果我們不使用管道和流動的方式,直接先從服務端加載完視頻文件,然后再播放。會造成很多問題

  1.  因內存占有太多而導致系統卡頓或者崩潰
  2.  因為我們的網速 內存 cpu運算速度都是有限的,而且還要有多個程序共享使用,一個視頻文件加載完可能有幾個g那么大。

讀取大文件data的例子

有一個這樣的需求,想要讀取大文件data的例子

使用文件讀取 

  1. const http = require('http');  
  2. const fs = require('fs');  
  3. const path = require('path');  
  4. const server = http.createServer(function (req, res) {  
  5.     const fileName = path.resolve(__dirname, 'data.txt');  
  6.     fs.readFile(fileName, function (err, data) {  
  7.         res.end(data);  
  8.     });  
  9. });  
  10. server.listen(8000); 

使用文件讀取這段代碼語法上并沒有什么問題,但是如果data.txt文件非常大的話,到了幾百M,在響應大量用戶并發請求的時候,程序可能會消耗大量的內存,這樣可能造成用戶連接緩慢的問題。而且并發請求過大的話,服務器內存開銷也會很大。這時候我們來看一下用stream實現。 

  1. const http = require('http');  
  2. const fs = require('fs');  
  3. const path = require('path');  
  4. const server = http.createServer(function (req, res) {  
  5.     const fileName = path.resolve(__dirname, 'data.txt');  
  6.     let stream = fs.createReadStream(fileName);  // 這一行有改動  
  7.     stream.pipe(res); // 這一行有改動  
  8. });  
  9. server.listen(8000); 

使用stream就可以不需要把文件全部讀取了再返回,而是一邊讀取一邊返回,數據通過管道流動給客戶端,真的減輕了服務器的壓力。

看了兩個例子我想小伙伴們應該知道為什么要使用stream了吧!因為一次性讀取,操作大文件,內存和網絡是吃不消的,因此要讓數據流動起來,一點點的進行操作。

stream流轉過程

再次看這張水桶管道流轉圖

圖中可以看出,stream整個流轉過程包括source,dest,還有連接二者的管道pipe(stream的核心),分別介紹三者來帶領大家搞懂stream流轉過程。

stream從哪里來-soucre

stream的常見來源方式有三種:

  1.  從控制臺輸入
  2.  http請求中的request
  3.  讀取文件

這里先說一下從控制臺輸入這種方式,2和3兩種方式stream應用場景章節會有詳細的講解。

看一段process.stdin的代碼 

  1. process.stdin.on('data', function (chunk) {  
  2.     console.log('stream by stdin', chunk)  
  3.     console.log('stream by stdin', chunk.toString())  
  4. })  
  5. //控制臺輸入koalakoala后輸出結果  
  6. stream by stdin <Buffer 6b 6f 616c 616b 6f 616c 610a>  
  7. stream by stdin koalakoala 

運行上面代碼:然后從控制臺輸入任何內容都會被data 事件監聽到,process.stdin就是一個stream對象,data 是stream對象用來監聽數據傳入的一個自定義函數,通過輸出結果可看出process.stdin是一個stream對象。

說明:stream對象可以監聽"data","end","opne","close","error"等事件。node.js中監聽自定義事件使用.on方法,例如process.stdin.on(‘data’,…), req.on(‘data’,…),通過這種方式,能很直觀的監聽到stream數據的傳入和結束

連接水桶的管道-pipe

從水桶管道流轉圖中可以看到,在source和dest之間有一個連接的管道pipe,它的基本語法是source.pipe(dest),source和dest就是通過pipe連接,讓數據從source流向了dest。

stream到哪里去-dest

stream的常見輸出方式有三種:

  1.  輸出控制臺
  2.  http請求中的response
  3.  寫入文件

stream應用場景

stream的應用場景主要就是處理IO操作,而http請求和文件操作都屬于IO操作。這里再提一下stream的本質——由于一次性IO操作過大,硬件開銷太多,影響軟件運行效率,因此將IO分批分段進行操作,讓數據像水管一樣流動起來,直到流動完成,也就是操作完成。下面對幾個常用的應用場景分別進行介紹

介紹一個壓力測試的小工具

一個對網絡請求做壓力測試的工具ab,ab 全稱 Apache bench ,是 Apache 自帶的一個工具,因此使用 ab 必須要安裝 Apache 。mac os 系統自帶 Apache ,windows用戶視自己的情況進行安裝。運行ab 之前先啟動 Apache ,mac os 啟動方式是 sudo apachectl start 。

Apache bench對應參數的詳細學習地址,有興趣的可以看一下Apache bench對應參數的詳細學習地址

介紹這個小工具的目的是對下面幾個場景可以進行直觀的測試,看出使用stream帶來了哪些性能的提升。

get請求中應用stream

這樣一個需求:

使用node.js實現一個http請求,讀取data.txt文件,創建一個服務,監聽8000端口,讀取文件后返回給客戶端,講get請求的時候用一個常規文件讀取與其做對比,請看下面的例子。

  •  常規使用文件讀取返回給客戶端response例子 ,文件命名為getTest1.js 
  1. // getTest.js  
  2. const http = require('http');  
  3. const fs = require('fs');  
  4. const path = require('path');  
  5. const server = http.createServer(function (req, res) {  
  6.     const method = req.method; // 獲取請求方法  
  7.     if (method === 'GET') { // get 請求方法判斷  
  8.         const fileName = path.resolve(__dirname, 'data.txt');  
  9.         fs.readFile(fileName, function (err, data) {  
  10.             res.end(data);  
  11.         });  
  12.     }  
  13. });  
  14. server.listen(8000); 
  •  使用stream返回給客戶端response 將上面代碼做部分修改,文件命名為getTest2.js 
  1. // getTest2.js  
  2. // 主要展示改動的部分  
  3. const server = http.createServer(function (req, res) {  
  4.     const method = req.method; // 獲取請求方法  
  5.     if (method === 'GET') { // get 請求  
  6.         const fileName = path.resolve(__dirname, 'data.txt');  
  7.         let stream = fs.createReadStream(fileName);  
  8.         stream.pipe(res); // 將 res 作為 stream 的 dest  
  9.     }  
  10. });  
  11. server.listen(8000); 

對于下面get請求中使用stream的例子,會不會有些小伙伴提出質疑,難道response也是一個stream對象,是的沒錯,對于那張水桶管道流轉圖,response就是一個dest。

雖然get請求中可以使用stream,但是相比直接file文件讀取·res.end(data)有什么好處呢?這時候我們剛才推薦的壓力測試小工具就用到了。getTest1和getTest2兩段代碼,將data.txt內容增加大一些,使用ab工具進行測試,運行命令ab -n 100 -c 100 http://localhost:8000/,其中-n 100表示先后發送100次請求,-c 100表示一次性發送的請求數目為100個。對比結果分析使用stream后,有非常大的性能提升,小伙伴們可以自己實際操作看一下。

post中使用stream

一個通過post請求微信小程序的地址生成二維碼的需求。 

  1. /*  
  2. * 微信生成二維碼接口  
  3. * params src 微信url / 其他圖片請求鏈接  
  4. * params localFilePath: 本地路徑  
  5. * params data: 微信請求參數  
  6. * */  
  7. const downloadFile=async (src, localFilePath, data)=> {  
  8.     try{  
  9.         const ws = fs.createWriteStream(localFilePath);  
  10.         returnnewPromise((resolve, reject) => {  
  11.             ws.on('finish', () => {  
  12.                 resolve(localFilePath);  
  13.             });  
  14.             if (data) {  
  15.                 request({  
  16.                     method: 'POST',  
  17.                     uri: src,  
  18.                     json: true,  
  19.                     body: data  
  20.                 }).pipe(ws);  
  21.             } else {  
  22.                 request(src).pipe(ws);  
  23.             }  
  24.         });  
  25.     }catch (e){  
  26.         logger.error('wxdownloadFile error: ',e);  
  27.         throw e;  
  28.     }  

看這段使用了stream的代碼,為本地文件對應的路徑創建一個stream對象,然后直接.pipe(ws),將post請求的數據流轉到這個本地文件中,這種stream的應用在node后端開發過程中還是比較常用的。

post與get使用stream總結

request和reponse一樣,都是stream對象,可以使用stream的特性,二者的區別在于,我們再看一下水桶管道流轉圖,

request是source類型,是圖中的源頭,而response是dest類型,是圖中的目的地。

在文件操作中使用stream

一個文件拷貝的例子 

  1. const fs = require('fs')  
  2. const path = require('path')  
  3. // 兩個文件名  
  4. const fileName1 = path.resolve(__dirname, 'data.txt')  
  5. const fileName2 = path.resolve(__dirname, 'data-bak.txt')  
  6. // 讀取文件的 stream 對象  
  7. const readStream = fs.createReadStream(fileName1)  
  8. // 寫入文件的 stream 對象  
  9. const writeStream = fs.createWriteStream(fileName2)  
  10. // 通過 pipe執行拷貝,數據流轉  
  11. readStream.pipe(writeStream)  
  12. // 數據讀取完成監聽,即拷貝完成  
  13. readStream.on('end', function () {  
  14.     console.log('拷貝完成')  
  15. }) 

看了這段代碼,發現是不是拷貝好像很簡單,創建一個可讀數據流readStream,一個可寫數據流writeStream,然后直接通過pipe管道把數據流轉過去。這種使用stream的拷貝相比存文件的讀寫實現拷貝,性能要增加很多,所以小伙伴們在遇到文件操作的需求的時候,盡量先評估一下是否需要使用stream實現。

前端一些打包工具的底層實現

目前一些比較火的前端打包構建工具,都是通過node.js編寫的,打包和構建的過程肯定是文件頻繁操作的過程,離不來stream,例如現在比較火的gulp,有興趣的小伙伴可以去看一下源碼。

stream的種類

  •  Readable Stream 可讀數據流
  •  Writeable Stream 可寫數據流
  •  Duplex Stream 雙向數據流,可以同時讀和寫
  •  Transform Stream 轉換數據流,可讀可寫,同時可以轉換(處理)數據(不常用)

之前的文章都是圍繞前兩種可讀數據流和可寫數據流,第四種流不太常用,需要的小伙伴網上搜索一下,接下來對第三種數據流Duplex Stream 說明一下。

Duplex Stream 雙向的,既可讀,又可寫。Duplex streams同時實現了 Readable和Writable 接口。Duplex streams的例子包括

  •  tcp sockets
  •  zlib streams
  •  crypto streams我在項目中還未使用過雙工流,一些Duplex Stream的內容可以參考這篇文章NodeJS Stream 雙工流

stream有什么弊端

  •  用 rs.pipe(ws) 的方式來寫文件并不是把 rs 的內容 append 到 ws 后面,而是直接用 rs 的內容覆蓋 ws 原有的內容
  •  已結束/關閉的流不能重復使用,必須重新創建數據流
  •  pipe 方法返回的是目標數據流,如 a.pipe(b) 返回的是 b,因此監聽事件的時候請注意你監聽的對象是否正確
  •  如果你要監聽多個數據流,同時你又使用了 pipe 方法來串聯數據流的話,你就要寫成:代碼實例: 
  1. data  
  2.        .on('end', function() {  
  3.            console.log('data end');  
  4.        })  
  5.        .pipe(a)  
  6.        .on('end', function() {  
  7.            console.log('a end');  
  8.        }) 
  9.        .pipe(b)  
  10.        .on('end', function() {  
  11.            console.log('b end');  
  12.        }); 

stream的常見類庫

  •  event-stream 用起來有函數式編程的感覺
  •  awesome-nodejs#streams也是一個不錯的第三方stream庫,有興趣的小伙伴可以github看一下

總結

本篇文章屬于進階路線【Node必知必會系列】,看完了這篇文章是不是對stream有了一定的了解,并且知道了node對于文件處理還是有完美的解決方案的。本文中三次展示了水桶管道流轉圖,總要的事情說三遍希望小伙伴們記住它,除了以上內容小伙伴們會不會有一些思考,比如

  1.  stream數據流轉具體內容是什么呢?二進制還是string類型還是其他類型,該類型為stream帶來了什么好處?
  2.  水桶管道流轉圖中的水管,也就是pipe函數什么時候觸發的呢?在什么情況下觸流轉發?底層機制是什么?上面的疑問(由于篇幅過長拆分為兩篇)會在我stream的第二篇文章為大家詳細講解 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2021-09-26 05:06:04

Node.js模塊機制

2021-03-01 08:03:26

Node.jsStream模塊

2025-05-26 00:31:31

2019-12-17 11:40:44

Node.js模塊前端

2023-06-30 23:25:46

HTTP模塊內存

2012-03-09 09:11:29

Node.js

2011-12-09 11:16:48

Node.js

2024-01-05 08:49:15

Node.js異步編程

2016-08-11 14:02:02

NodeJS前端

2021-05-21 09:36:42

開發技能代碼

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2011-09-08 14:07:28

Node.js

2023-06-20 19:35:00

Node.js工具

2017-03-20 13:43:51

Node.js內存泄漏

2017-03-19 16:40:28

漏洞Node.js內存泄漏

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2021-01-26 08:07:44

Node.js模塊 Async
點贊
收藏

51CTO技術棧公眾號

日韩欧美电影一二三| 最新国产精品久久精品| 青青精品视频播放| 999精品在线视频| 日韩精品中文字幕一区二区| 精品久久久久久久久中文字幕| 欧美三级网色| www.亚洲欧美| 日韩激情一区二区| 欧美激情图片区| 99久久久无码国产精品性| 国产精品视频一区视频二区| 婷婷六月综合亚洲| 在线视频91| 蜜桃免费在线| 风间由美一区二区三区在线观看| 日韩av成人在线| 强行糟蹋人妻hd中文| 成人av国产| 亚洲国产天堂久久综合| 福利视频999| 巨茎人妖videos另类| 一区二区不卡在线视频 午夜欧美不卡在| 精品在线不卡| 精品人妻一区二区三区换脸明星 | 精品视频在线观看免费观看 | 亚洲激情在线观看视频| 成人免费一区二区三区牛牛| 中文字幕一区二区三区蜜月| 欧美精品一区二区三区在线四季| 国产免费一区二区三区最新不卡 | 69视频在线| 91小视频免费看| 99热在线国产| 国产农村老头老太视频| 青草av.久久免费一区| 97久久精品在线| 精品一区在线视频| 欧美日韩1080p| 亚洲国产精品国自产拍av| 成人影片在线播放| 99国产精品一区二区三区| 日韩av一区二区在线影视| 欧美在线欧美在线| 日韩精品视频免费播放| 欧美激情在线| 欧美精品在线第一页| www.超碰在线观看| 亚洲精彩视频| 欧美大胆在线视频| 538任你躁在线精品视频网站| 99久久99热这里只有精品| 尤物九九久久国产精品的分类| 草草地址线路①屁屁影院成人| 国产精品久久久网站| 欧美精品一区二区三区高清aⅴ| 91丨porny丨九色| 伊色综合久久之综合久久| 日韩一区二区三| 国产亚洲精品成人a| 国产成人精品福利| 亚洲第一区第二区| 人妻丰满熟妇av无码久久洗澡 | 国产日韩电影| 色域天天综合网| 少妇高清精品毛片在线视频| 中文字幕av一区二区三区佐山爱| 一本色道a无线码一区v| 国产偷国产偷亚洲清高网站| 久久久久久尹人网香蕉| 国产少妇在线观看| 国内精品99| 欧美亚洲第一页| 成人a v视频| 久久 天天综合| 99精品99久久久久久宅男| 亚洲经典一区二区| 91看片淫黄大片一级在线观看| 欧美在线播放一区二区| 91网页在线观看| 亚洲男人天堂av| 青草青青在线视频| 日韩成人动漫| 7777女厕盗摄久久久| 国产伦精品一区二区三区精品| 亚洲深夜福利在线观看| 精品国产一区二区三区久久狼黑人| 欧美亚洲日本在线| 香蕉成人久久| 91精品啪aⅴ在线观看国产| 亚洲精品国产片| 久久久久久久电影| 91免费视频黄| 亚洲黄色网址| 欧美一区二区三区日韩| 精品人妻一区二区三区香蕉| 久久国产亚洲精品| 羞羞色国产精品| 波多野结衣一本一道| 国产69精品一区二区亚洲孕妇| 久久大片网站| 91麻豆国产福利在线观看宅福利| 精品日韩美女的视频高清 | 激情成人综合网| 狠狠色综合网站久久久久久久| 97超碰国产一区二区三区| 亚洲成a人v欧美综合天堂| 精品中文字幕人| 色大18成网站www在线观看| 精品国产户外野外| 欧美性受xxxx黒人xyx性爽| 天堂在线精品| 欧美理论电影在线观看| 最近中文字幕免费观看| 成人免费毛片app| 亚洲在线不卡| 中文字幕影音在线| 日韩亚洲欧美在线| 网站永久看片免费| 久久久久免费| 激情一区二区三区| 午夜成年人在线免费视频| 欧美性猛片aaaaaaa做受| 亚洲调教欧美在线| 欧美日韩国产亚洲一区| 91免费国产视频| 91caoporm在线视频| 一本一道久久a久久精品| 亚洲天堂美女视频| 伊人久久成人| 99热99热| 欧美日韩在线视频免费观看| 91精品在线免费| 极品尤物一区二区| 日韩**一区毛片| 欧美午夜精品久久久久免费视| 一本大道色婷婷在线| 亚洲国产精品中文| 国产中文字字幕乱码无限| 国产精品18久久久久久vr| 免费看啪啪网站| 999色成人| 久久久极品av| 99riav国产| 亚洲乱码中文字幕综合| 肉色超薄丝袜脚交| 欧美在线国产| 91视频99| 7777kkk亚洲综合欧美网站| 精品国产乱码久久| 国产精品免费av一区二区| 北岛玲一区二区三区四区| 2018日日夜夜| 色婷婷精品视频| 国产精品h在线观看| 成人不用播放器| 91福利国产精品| 国产精品麻豆一区| 韩国午夜理伦三级不卡影院| www.国产亚洲| 极品一区美女高清| 热99在线视频| 高清美女视频一区| 欧美精品一二三区| 欧美日韩亚洲国产另类| 成人av在线播放网址| 国产成人无码精品久久久性色| 西野翔中文久久精品国产| 热久久这里只有精品| 国产精品无码2021在线观看| 欧美片网站yy| 国产在线欧美在线| 久久网站热最新地址| 999精彩视频| 欧美不卡高清| 久久99国产精品| 日韩漫画puputoon| 免费av一区二区| 日韩电影免费| 91精品国模一区二区三区| 日本少妇做爰全过程毛片| 久久精品视频在线看| 国产精品嫩草影院8vv8| 亚洲国产婷婷| 色女孩综合网| 91精品啪在线观看国产爱臀| 青青a在线精品免费观看| 日本亚洲精品| 日韩av在线一区二区| 亚洲一区中文字幕永久在线| 亚洲一区日韩精品中文字幕| 亚洲av无码一区二区三区人| 国产乱国产乱300精品| av动漫在线观看| 中文字幕一区二区精品区| 精品无人区一区二区三区 | 黄色一区三区| 久久99久久久精品欧美| 欧美区在线播放| 大乳在线免费观看| 精品国内片67194| 久草热在线观看| 亚洲成人免费电影| 成人无码精品1区2区3区免费看| av福利精品导航| 三日本三级少妇三级99| 亚洲免费婷婷| 日本精品福利视频| 日韩综合网站| 欧美日韩另类综合| 136福利精品导航| 国产精品久久久久久久久免费 | 色的视频在线免费看| 亚洲激情电影中文字幕| av在线亚洲天堂| 欧美亚洲国产bt| 中日韩黄色大片| 亚洲精品国产精华液| 东京热无码av男人的天堂| 久久综合狠狠综合久久综合88| 丰满人妻一区二区三区大胸| 蜜臀av国产精品久久久久| 欧洲黄色一级视频| 亚洲午夜激情在线| 日本免费成人网| 婷婷激情综合| 在线播放 亚洲| 久久人人99| 亚洲精品自在在线观看| 精品freesex老太交| 久久综合一区| 香蕉久久夜色精品国产使用方法| 国产精品日韩一区二区三区| 日韩精品中文字幕吗一区二区| 91精品在线观| 亚洲人成777| 96pao国产成视频永久免费| 久久久久久国产精品免费无遮挡| 亚洲欧美制服第一页| 水莓100国产免费av在线播放| 亚洲风情亚aⅴ在线发布| 亚洲精品中文字幕成人片| 日韩午夜电影av| 国产夫妻自拍av| 日韩免费一区二区三区在线播放| 国产精品一区二区免费视频| 欧美日韩精品福利| 国产人妖一区二区三区| 91精品国产欧美一区二区成人| 亚洲一区中文字幕永久在线| 欧美日韩高清一区| 国产在成人精品线拍偷自揄拍| 欧美美女直播网站| 国产男男gay体育生白袜| 日韩欧美成人一区二区| 丰满人妻一区二区三区免费| 精品国产凹凸成av人网站| 无码h黄肉3d动漫在线观看| 日韩精品一区二区三区第95| 欧美成人免费| 永久免费精品影视网站| 国产午夜精品久久久久免费视| 久久国产精品视频| 搞黄网站在线看| 日韩免费在线观看视频| 欧美一级做a| av色综合网| 亚洲国产欧美日韩在线观看第一区 | 中文字幕 日韩有码| 欧美老肥妇做.爰bbww| www国产一区| 日韩乱码在线视频| av网站在线免费观看| 美女少妇精品视频| 蜜桃视频在线网站| 国产玖玖精品视频| 日韩精品一页| 国产日韩亚洲精品| 国产一区二区三区四区五区传媒 | 国产手机在线观看| 中文字幕色av一区二区三区| 久久亚洲成人av| 午夜激情一区二区| 中文 欧美 日韩| 精品日韩一区二区三区| 国产乱视频在线观看| 久久伊人免费视频| 无遮挡爽大片在线观看视频| 国产日本欧美一区二区三区在线| 日本成人手机在线| 欧美一区二区三区精美影视| 欧美1级日本1级| 黑鬼大战白妞高潮喷白浆| 国产乱国产乱300精品| 国产三级国产精品| 有坂深雪av一区二区精品| www.欧美色| 亚洲福利视频在线| av在线中文| 18久久久久久| 亚洲国产欧美国产第一区| 欧美日韩一区二区三区在线观看免 | 狠狠色丁香久久婷婷综| 精品人妻一区二区三区日产乱码卜| 中文字幕在线不卡视频| 久久亚洲精品石原莉奈| 亚洲精品在线电影| 精品176二区| 国产精品aaa| 日本成人7777| 可以看毛片的网址| 国内精品免费**视频| 最近中文字幕免费| 亚洲成人av一区| 国产成人精品无码高潮| 中文字幕日韩电影| 小黄鸭精品aⅴ导航网站入口| 国产精品区一区| 一区二区蜜桃| 污网站在线免费| 国产日本欧美一区二区| 亚洲精品午夜国产va久久成人| 日韩免费在线观看| 免费人成在线观看播放视频| 国产精品毛片a∨一区二区三区|国 | 美女精品导航| 91热精品视频| 亚洲成人99| 国产无遮挡猛进猛出免费软件 | 日韩激情在线视频| 国内在线免费视频| 99久久99久久精品国产片| 亚洲mv大片欧洲mv大片| 拔插拔插华人永久免费| 国产精品天天看| 中文字幕视频一区二区| 尤物99国产成人精品视频| 91成人在线| 伊甸园精品99久久久久久| 蜜桃av噜噜一区| 国产3级在线观看| 7777女厕盗摄久久久| 高h视频在线观看| 国产美女久久精品| 国产精品99久久久久久动医院| 久热精品在线观看视频| 中文字幕亚洲在| 国产99999| 欧美极品第一页| 噜噜噜天天躁狠狠躁夜夜精品| 无码粉嫩虎白一线天在线观看| 波多野结衣一区二区三区| 国产精品久久久久久久妇| 国产丝袜一区二区| 高清成人在线| 超碰成人在线免费观看| 国产乱妇无码大片在线观看| 久久精品久久国产| 日韩二区三区在线| 国产精成人品2018| 久久久成人精品一区二区三区 | 欧美日韩午夜精品| 精品国产丝袜高跟鞋| 成人av资源网| 裸体一区二区| 顶级黑人搡bbw搡bbbb搡| 日韩视频在线你懂得| 啊啊啊久久久| 奇米影视首页 狠狠色丁香婷婷久久综合 | 亚洲经典一区二区三区| 欧美一级在线播放| 成人羞羞在线观看网站| 日韩av加勒比| 欧美日韩一区二区免费在线观看| 精品久久av| 91九色单男在线观看| 亚洲黄色影院| jizz日本在线播放| 精品久久久久久久人人人人传媒 | 18+视频在线观看| 国语精品免费视频| 免费成人美女在线观看| 青娱乐国产盛宴| 亚洲精选中文字幕| 成人精品在线| 国产精品-区区久久久狼| 最新国产精品久久精品| 亚洲 美腿 欧美 偷拍| 国产欧美日韩综合精品| 亚洲国产午夜| 久久高清内射无套| 亚洲精选中文字幕| 香蕉免费一区二区三区在线观看| 能在线观看的av| 亚洲三级视频在线观看| 日本亚洲欧美| 99爱精品视频| 麻豆高清免费国产一区| 亚洲 欧美 日韩 综合| 久久在线视频在线|