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

數(shù)據(jù)實(shí)時(shí)更新的多種實(shí)現(xiàn)方式,你會(huì)嗎?

開發(fā) 前端
Web 應(yīng)用愈發(fā)復(fù)雜,用戶對(duì)實(shí)時(shí)交互體驗(yàn)的要求也越來越高,比如:社媒的即時(shí)通訊、大屏的數(shù)據(jù)更新、實(shí)時(shí)消息的提醒等,這些都表明實(shí)時(shí)交互已成高品質(zhì)應(yīng)用的必備特性。

一、前言

如今,Web 應(yīng)用愈發(fā)復(fù)雜,用戶對(duì)實(shí)時(shí)交互體驗(yàn)的要求也越來越高,比如:社媒的即時(shí)通訊、大屏的數(shù)據(jù)更新、實(shí)時(shí)消息的提醒等,這些都表明實(shí)時(shí)交互已成高品質(zhì)應(yīng)用的必備特性。而作為開發(fā)者,我們常面對(duì)復(fù)雜的開發(fā)環(huán)境,要應(yīng)對(duì)即時(shí)通訊與數(shù)據(jù)實(shí)時(shí)更新的問題。那么,該如何精準(zhǔn)高效實(shí)現(xiàn)這些功能呢?我們將共同探討下,輪詢、Web Socket 、SSE(Server-Sent Events) 三種解決方案,最終根據(jù)當(dāng)下場(chǎng)景選出最優(yōu)方案,打造更為出色的產(chǎn)品。

二、方案一:輪詢(Polling)

1. 短輪詢

實(shí)現(xiàn)短輪詢,我們可以采用定時(shí)器的方式來實(shí)現(xiàn),讓客戶端每隔較短固定時(shí)間就向服務(wù)端發(fā)起請(qǐng)求,無論服務(wù)器有無新消息,都會(huì)正常給予回應(yīng)。短輪詢的優(yōu)劣勢(shì)一目了然。優(yōu)勢(shì)在于,容易理解、實(shí)現(xiàn)過程簡(jiǎn)便,同時(shí)兼容性又很好,在幾乎所有支持 HTTP 協(xié)議的瀏覽器及服務(wù)器環(huán)境都能很好的運(yùn)行短輪詢。不過,缺點(diǎn)也非常顯而易見。當(dāng)按照很短的固定時(shí)間間隔去頻繁請(qǐng)求數(shù)據(jù),如果此時(shí)的數(shù)據(jù)并未更新,這些請(qǐng)求就成了無效請(qǐng)求,但是每一個(gè)無效的請(qǐng)求都得完成 HTTP 建立連接的一系列流程,像三次握手 、 四次揮手 ,這無疑造成了不必要的資源浪費(fèi)。同時(shí)也是由于按固定間隔請(qǐng)求,數(shù)據(jù)更新也可能會(huì)存在延遲的現(xiàn)象,在要求實(shí)時(shí)性的場(chǎng)景下就不滿足了。

圖片圖片

2. 長(zhǎng)輪詢

相對(duì)于短輪詢,長(zhǎng)輪詢的實(shí)現(xiàn)過程會(huì)復(fù)雜一些。首先,同樣是由客戶端向服務(wù)端發(fā)送HTTP請(qǐng)求后,不過與短輪詢的差別在于,服務(wù)器接到請(qǐng)求后并不即刻返回響應(yīng),而是選擇將該請(qǐng)求暫時(shí)掛起,靜靜等待數(shù)據(jù)更新,或是直至達(dá)到特定的超時(shí)時(shí)間(這個(gè)超時(shí)時(shí)間通常比短輪詢間隔長(zhǎng))。在等待期間,如果有數(shù)據(jù)更新了,就會(huì)立即將新數(shù)據(jù)返回給客戶端,若一直未等到數(shù)據(jù)更新,直到達(dá)到超時(shí)時(shí)間,服務(wù)器才返回一個(gè)空響應(yīng)或者告知客戶端無新數(shù)據(jù)。客戶端收到響應(yīng)后,無論是否有新數(shù)據(jù),都會(huì)立即再次發(fā)起新的長(zhǎng)輪詢請(qǐng)求,如此循環(huán)往復(fù)。

這種長(zhǎng)輪詢方式相較短輪詢存在一定優(yōu)勢(shì),首先減少了無效請(qǐng)求的次數(shù),因?yàn)橹挥性跀?shù)據(jù)更新的時(shí)候,服務(wù)器才會(huì)響應(yīng),實(shí)時(shí)性得到了增強(qiáng),也同時(shí)在一定程度上節(jié)省了網(wǎng)絡(luò)資源。長(zhǎng)輪詢雖然減少了無效請(qǐng)求,但是長(zhǎng)時(shí)間掛起的請(qǐng)求仍會(huì)占用服務(wù)器的內(nèi)存、線程等關(guān)鍵資源。若同時(shí)存在大量長(zhǎng)輪詢請(qǐng)求,且長(zhǎng)時(shí)間處于等待數(shù)據(jù)更新狀態(tài),服務(wù)器資源可能會(huì)被大量消耗,同樣可能引發(fā)性能問題。

圖片圖片

由此可見, 無論是運(yùn)用長(zhǎng)輪詢還是短輪詢策略,在對(duì)實(shí)時(shí)性有著嚴(yán)格要求的場(chǎng)景之下這都不是一個(gè)非常好的方案。一方面,頻繁的無效請(qǐng)求以及長(zhǎng)時(shí)間掛起的連接,極易造成服務(wù)器資源的浪費(fèi)。另一方面,由于輪詢時(shí)間間隔的固定性,一旦設(shè)置的不合理,就可能錯(cuò)失數(shù)據(jù)更新的最佳時(shí)機(jī),無法及時(shí)將關(guān)鍵信息推送給客戶端,導(dǎo)致實(shí)時(shí)交互出現(xiàn)延遲。

三、方案二:Web Socket

Web Socket 是一種基于單個(gè) TCP 連接的協(xié)議,擁有實(shí)現(xiàn) 全雙工 通信的能力。它讓客戶端和服務(wù)端可以雙向、實(shí)時(shí)傳輸數(shù)據(jù),擺脫了傳統(tǒng) HTTP 請(qǐng)求那種請(qǐng)求 - 響應(yīng)模式的限制。有了 Web Socket,服務(wù)器能隨時(shí)主動(dòng)給客戶端推送消息,客戶端也能馬上向服務(wù)器發(fā)數(shù)據(jù),就如同構(gòu)建起了一條實(shí)時(shí)雙向通道。

圖片圖片

1.Web Socket通信原理

1)握手階段

  • 初始請(qǐng)求階段

a.首先,我們可以從下圖實(shí)現(xiàn)效果中看出來,起始于客戶端向服務(wù)端發(fā)送了一個(gè)HTTP請(qǐng)求,但這個(gè)請(qǐng)求和常規(guī)的HTTP請(qǐng)求又不太一致,他包含了兩個(gè)特殊的請(qǐng)求頭, Upgrade: websocket  和  Connection: Upgrade。

b.Upgrade: websocket 像是一個(gè)信號(hào),它的作用就是用來告知服務(wù)器,客戶端希望將當(dāng)前的通信協(xié)議從 HTTP升級(jí)為Web Socket協(xié)議。

c.Connection: Upgrade 是與Upgrade: websocket 進(jìn)行配合使用的,它的作用是告訴服務(wù)器,不要把這個(gè)請(qǐng)求當(dāng)作普通的 HTTP 請(qǐng)求來處理,而是要關(guān)注 “Upgrade” 請(qǐng)求頭中的內(nèi)容,按照要求進(jìn)行協(xié)議的升級(jí)。

  • 服務(wù)器響應(yīng)階段
  • 服務(wù)器收到客戶端的升級(jí)請(qǐng)求后,如果支持 Web Socket 協(xié)議,就會(huì)返回一個(gè)響應(yīng)來完成握手過程。響應(yīng)狀態(tài)碼通常是 101,表示 協(xié)議切換。響應(yīng)頭也會(huì)包含和客戶端請(qǐng)求對(duì)應(yīng)的 Upgrade 和 Connection 字段,確認(rèn)連接升級(jí)。Sec - WebSocket - Accept ,它是根據(jù)客戶端請(qǐng)求中的 Sec - WebSocket - Key 生成的,用于安全驗(yàn)證。通過這個(gè)握手過程,雙方就建立了一個(gè)穩(wěn)定的 Web Socket 連接這樣,這個(gè)連接是基于 TCP的,為后續(xù)的雙向通信做好了準(zhǔn)備。

2) 數(shù)據(jù)傳輸階段

  • 我們從下圖中可以看出,Web socket全雙工通道的特點(diǎn),客戶端可以向服務(wù)端主動(dòng)發(fā)送消息,服務(wù)端也可以推送數(shù)據(jù)到服務(wù)端。具體的數(shù)據(jù)格式,我們可以通過抓包軟件來進(jìn)行抓包看下。

3) 連接維護(hù)和關(guān)閉階段

  • 在整個(gè)通信過程中,Web Socket 協(xié)議要求客戶端和服務(wù)器都要維護(hù)連接的狀態(tài)。連接狀態(tài)包括連接是否打開、正在關(guān)閉或者已經(jīng)關(guān)閉等。客戶端和服務(wù)器通過心跳機(jī)制(發(fā)送周期性的小數(shù)據(jù)包來檢測(cè)對(duì)方是否還在線)或者其他自定義的連接檢測(cè)方法來確保連接的穩(wěn)定性。
  • 當(dāng)需要關(guān)閉 WebSocket 連接時(shí),無論是客戶端還是服務(wù)器都可以發(fā)起關(guān)閉請(qǐng)求。關(guān)閉請(qǐng)求也是通過發(fā)送一個(gè)特定的幀(關(guān)閉幀)來實(shí)現(xiàn)的。對(duì)方在收到關(guān)閉幀后,會(huì)進(jìn)行一些必要的清理工作,如釋放資源等,然后關(guān)閉連接。

2.示例

  • 模擬客戶端代碼
<div id="app">
  <input v-model="message" placeholder="輸入要發(fā)送的消息" />
  <button @click="sendMessage">發(fā)送消息</button>
  <div>
    <h3>收到的回復(fù)記錄:</h3>
    <ul>
      <li v-for="(msg, index) in receivedMessages" :key="msg">{{ msg }}</li>
    </ul>
  </div>
</div>

<script>
  const app = new Vue({
    el: "#app",
    data() {
      return {
        message: "",
        receivedMessages: [], // 新增數(shù)組用于存儲(chǔ)所有收到的消息
        socket: null,
      };
    },
    mounted() {
      // 創(chuàng)建WebSocket連接,這里的地址要和后端服務(wù)器監(jiān)聽的地址對(duì)應(yīng),這里假設(shè)后端在本地3000端口
      this.socket = new WebSocket("ws://localhost:3000");
      // 連接成功時(shí)觸發(fā)的事件
      this.socket.addEventListener("open", () => {
        console.log("已連接到WebSocket服務(wù)器");
      });
      // 接收服務(wù)器發(fā)送消息的事件
      this.socket.addEventListener("message", (event) => {
        const receivedMsg = event.data;
        this.receivedMessages.push(receivedMsg); // 將收到的消息添加到數(shù)組中
      });
      // 連接關(guān)閉時(shí)觸發(fā)的事件
      this.socket.addEventListener("close", () => {
        console.log("與WebSocket服務(wù)器的連接已關(guān)閉");
      });
    },
    methods: {
      sendMessage() {
        if (this.socket.readyState === WebSocket.OPEN) {
          this.socket.send(this.message);
          this.message = "";
        } else {
          console.log("WebSocket連接未就緒,無法發(fā)送消息");
        }
      },
    },
  });
</script>
  • 模擬服務(wù)端發(fā)送請(qǐng)求

注意:下方代碼中,定時(shí)器僅用來模擬,在實(shí)際業(yè)務(wù)中應(yīng)該替換為業(yè)務(wù)代碼

const WebSocket = require('ws');

// 創(chuàng)建WebSocket服務(wù)器實(shí)例,監(jiān)聽在3000端口,你可以根據(jù)需求修改端口號(hào)
const wss = new WebSocket.Server({ port: 3000 });

// 用于存儲(chǔ)已連接的客戶端WebSocket實(shí)例,方便后續(xù)向所有客戶端發(fā)送消息等操作
const clients = [];

// 當(dāng)有客戶端連接時(shí)觸發(fā)的事件
wss.on('connection', (ws) => {
  console.log('客戶端已連接');
  clients.push(ws);

  // 接收客戶端發(fā)送的消息
  ws.on('message', (message) => {
    console.log(`收到客戶端消息: ${message}`);
    // 這里簡(jiǎn)單地將收到的消息加上一個(gè)后綴后再發(fā)回客戶端
    const responseMessage = `你發(fā)送的消息是:${message}`;
    ws.send(responseMessage);
  });

  // 當(dāng)客戶端關(guān)閉連接時(shí)觸發(fā)的事件
  ws.on('close', () => {
    console.log('客戶端已斷開連接');
    const index = clients.indexOf(ws);
    if (index > -1) {
      clients.splice(index, 1);
    }
  });
});

// 【注意: 模擬一個(gè)定時(shí)任務(wù),每隔1秒向所有已連接的客戶端發(fā)送一條消息,你可以編寫自己的業(yè)務(wù)代碼】
setInterval(() => {
  const messageToSend = '這是服務(wù)端主動(dòng)發(fā)送的消息,當(dāng)前時(shí)間:' + new Date().toLocaleString();
  clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(messageToSend);
    }
  });
}, 1000);

console.log('WebSocket服務(wù)器已啟動(dòng),正在監(jiān)聽3000端口...');
  • 實(shí)現(xiàn)效果

圖片圖片

圖片圖片

3. 特點(diǎn)

相較于傳統(tǒng)的 HTTP 請(qǐng)求,Web Socket 在實(shí)時(shí)性方面展現(xiàn)出了卓越優(yōu)勢(shì),它打破了以往被動(dòng)等待響應(yīng)的模式,服務(wù)器得以實(shí)時(shí)且主動(dòng)地將數(shù)據(jù)推送至客戶端。在面對(duì)高實(shí)時(shí)性的場(chǎng)景下,大大的提升了用戶體驗(yàn)。并且只需建立一次 TCP 連接,后續(xù)數(shù)據(jù)傳輸高效便捷,既減少了網(wǎng)絡(luò)帶寬的無謂占用,又減輕了服務(wù)器頻繁處理連接請(qǐng)求的負(fù)擔(dān)。然而,當(dāng)應(yīng)用場(chǎng)景出現(xiàn)變化,假設(shè)客戶端僅僅是獲取服務(wù)端推送的消息,自身并無向服務(wù)端發(fā)送信息的需求,此時(shí),我們可以考慮下 SSE(Server-Sent Events)這個(gè)方案。

四、方案三:SSE

SSE(Server-Sent Events) 同樣具備了服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)的能力,而無需客戶端不斷地發(fā)起請(qǐng)求。與Web Socket不同的是,SSE 是基于 HTTP 協(xié)議的,使用的是單向通信, 而Web Socket是基于TCP協(xié)議的,使用的話雙向通信。

圖片圖片

1、SSE通信原理

1) 客戶端發(fā)起請(qǐng)求

  • 客戶端需要發(fā)送一個(gè)特定的請(qǐng)求告知服務(wù)器準(zhǔn)備接收事件。在傳統(tǒng)的 HTTP 請(qǐng)求 - 響應(yīng)模式中,一次請(qǐng)求完成后連接通常會(huì)關(guān)閉,但 SSE 通過在服務(wù)器端和客戶端設(shè)置特定的頭部信息,讓連接持續(xù)開啟。例如:設(shè)置了Content - Type頭部為text/event - stream,并設(shè)置Cache - Control為no - cache以及Connection為keep - alive,這樣告知客戶端,這是一個(gè) SSE 連接,數(shù)據(jù)會(huì)持續(xù)推送,并且不需要緩存數(shù)據(jù)。客戶端只需向服務(wù)器發(fā)送一個(gè)普通的 HTTP 請(qǐng)求,指向服務(wù)器端提供 SSE 服務(wù)的特定端點(diǎn)就行,例如/events,就可以順利開啟SSE連接。

2)服務(wù)器響應(yīng)請(qǐng)求

  • 服務(wù)器收到客戶端請(qǐng)求后,會(huì)維持一個(gè)長(zhǎng)連接,并且定期向客戶端發(fā)送事件數(shù)據(jù)。每個(gè)事件都是通過特定的格式(例如 data:\n\n)發(fā)送給客戶端的。

3) 客戶端接收數(shù)據(jù)

  • 客戶端通過 JavaScript 的 EventSource 對(duì)象接收從服務(wù)器推送過來的數(shù)據(jù)。這些數(shù)據(jù)可以是普通文本,也可以是 JSON 格式的對(duì)象,取決于服務(wù)器如何發(fā)送。

4) 事件流的關(guān)閉

  • 一旦不再需要推送數(shù)據(jù),比如客戶端主動(dòng)關(guān)閉連接,又或是中途出現(xiàn)錯(cuò)誤,導(dǎo)致無法繼續(xù)推送時(shí),服務(wù)器便會(huì)果斷關(guān)閉連接。

2、示例

  • 服務(wù)端,使用express框架為例

注意:下方代碼中,定時(shí)器僅用來模擬,在實(shí)際業(yè)務(wù)中應(yīng)該替換為業(yè)務(wù)代碼

const express = require('express');
const app = express();
const port = 3000;

// 設(shè)置響應(yīng)頭,表明這是一個(gè)SSE流
app.get('/events', (req, res) => {
    res.setHeader('Content-Type','text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');

    // 【注意:模擬定時(shí)發(fā)送數(shù)據(jù)(實(shí)際應(yīng)用中需要根據(jù)真實(shí)業(yè)務(wù)邏輯觸發(fā)發(fā)送)!!!】
    const interval = setInterval(() => {
        const data = `data: { "time": "${new Date().toLocaleString()}"}\n\n`;
        res.write(data);
    }, 3000);

    // 當(dāng)客戶端關(guān)閉連接時(shí),清除定時(shí)器
    req.on('close', () => {
        clearInterval(interval);
    });
});

app.listen(port, () => {
    console.log(`服務(wù)器運(yùn)行在 http://localhost:${port}`);
});
  • 模擬客戶端代碼
mounted() {
  const source = new EventSource('http://localhost:3000/events');
  source.onmessage = (event) => {
      const data = JSON.parse(event.data); // data 就是發(fā)送的消息
      this.message = data.message;
  };
  source.onerror = (error) => {
      console.log('SSE連接出錯(cuò):', error);
  };
}
  • 實(shí)現(xiàn)效果

圖片圖片

圖片圖片

3.特點(diǎn)

對(duì)于SSE來說,優(yōu)勢(shì)上在于簡(jiǎn)單易用,客戶端用 EventSource可以接收,服務(wù)器端定期發(fā)數(shù)據(jù)即可推送。且單向通信、基于長(zhǎng)連接,服務(wù)器資源消耗低。不過,SSE 是有局限的。只能夠進(jìn)行單向通信,現(xiàn)代瀏覽器大多支持,但是IE或者舊版本瀏覽器不支持。SSE 只支持文本格式的數(shù)據(jù)流,不支持二進(jìn)制數(shù)據(jù)傳輸。總之,SSE 在合適場(chǎng)景能發(fā)揮優(yōu)勢(shì),支撐實(shí)時(shí)數(shù)據(jù)推送需求。

五、總結(jié)

上述文章中,介紹了輪詢、Web Socket、SSE 三種方案。適合的場(chǎng)景也有一些差別,例如:輪詢的方式可以在更新頻率不高的場(chǎng)景下使用、Web Socket可以在需要雙向交互的場(chǎng)景下使用、SSE適用于服務(wù)器到客戶端的單向數(shù)據(jù)流的場(chǎng)景下使用。開發(fā)者可以根據(jù)場(chǎng)景選擇最優(yōu)方案,提升產(chǎn)品實(shí)時(shí)交互體驗(yàn)。

責(zé)任編輯:武曉燕 來源: 大轉(zhuǎn)轉(zhuǎn)FE
相關(guān)推薦

2016-05-03 14:02:44

2024-07-03 08:02:19

MySQL數(shù)據(jù)搜索

2021-08-19 15:36:09

數(shù)據(jù)備份存儲(chǔ)備份策略

2025-01-10 09:15:57

2014-01-22 11:22:44

華為HANA一體機(jī)FusionCube大數(shù)據(jù)分析

2024-02-22 08:31:26

數(shù)據(jù)恢復(fù)工具MySQL回滾SQL

2021-09-13 07:23:52

Go Set 設(shè)計(jì)

2011-06-22 10:37:08

rsyncinotify

2021-02-26 05:21:56

MySQL數(shù)據(jù)設(shè)計(jì)

2017-01-16 14:13:37

分布式數(shù)據(jù)庫

2018-04-03 16:24:34

分布式方式

2023-01-31 08:34:19

2022-07-05 08:05:00

策略模式接口實(shí)現(xiàn)類

2020-09-28 14:24:09

字典Dictionary遍歷

2024-10-18 08:00:00

SpringBoot框架開發(fā)

2019-05-07 15:49:27

AI人工智能藝術(shù)

2024-09-02 09:31:19

2010-07-13 10:40:30

唐駿

2020-06-01 15:13:41

騰訊云圖數(shù)據(jù)庫

2024-06-06 08:58:08

大數(shù)據(jù)SQLAPI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品水嫩水嫩| 美腿丝袜亚洲一区| 日韩黄色av网站| 激情内射人妻1区2区3区| 成人免费在线电影| 国产在线麻豆精品观看| 性亚洲最疯狂xxxx高清| 免费看污片的网站| 日韩免费一级| 在线观看91精品国产入口| 少妇高潮大叫好爽喷水| 全色精品综合影院| 国产一区二区三区蝌蚪| 欧美专区在线播放| 激情五月婷婷小说| 成人在线亚洲| 亚洲第一区中文字幕| 538任你躁在线精品免费| 欧美xxxxhdvideosex| 久久精品亚洲国产奇米99| 成人午夜黄色影院| 久久亚洲精品石原莉奈| 欧美日韩一区自拍| 色婷婷综合成人| 人人妻人人澡人人爽人人精品| 成人在线精品| 日韩欧美国产激情| 大西瓜av在线| a视频在线免费看| 中国av一区二区三区| 精品一区二区国产| wwwav网站| 久久99精品久久久久婷婷| 奇门遁甲1982国语版免费观看高清| 黄色一级视频在线观看| 日韩欧美中文| 亚洲视频网站在线观看| 久久久国产精品无码| 一本一道久久a久久| 7777精品伊人久久久大香线蕉 | 九色在线播放| av一区二区三区黑人| 91免费高清视频| 中文天堂在线资源| 日韩av一区二区三区| 欧美一级淫片丝袜脚交| 久久草视频在线| 伊人久久婷婷| 欧美激情视频网| 91aaa在线观看| 亚洲91中文字幕无线码三区| 中文日韩在线观看| 日韩视频在线观看免费视频| 中文字幕中文字幕精品| 日韩成人av在线| www国产视频| 开心激情综合| 亚洲国产精品网站| 制服丝袜第二页| 窝窝社区一区二区| 日韩电影中文字幕| 成人精品999| 国产精品一线天粉嫩av| 亚洲人成网站999久久久综合| 欧美特级黄色录像| 精品一级毛片| 丝袜一区二区三区| chinese全程对白| 欧美 日韩 国产 一区| 欧美国产高跟鞋裸体秀xxxhd| 久久久香蕉视频| 国产精品毛片| 国产91精品网站| 做爰视频毛片视频| 国产伦精品一区二区三区在线观看| 亚洲最大福利视频网| www日本高清视频| kk眼镜猥琐国模调教系列一区二区| 激情伦成人综合小说| 免费一级毛片在线观看| 国产精品色婷婷久久58| 亚洲五码在线观看视频| 理论片午夜视频在线观看| 日韩欧美黄色动漫| 午夜国产福利在线观看| 波多野结衣一区二区三区免费视频| 欧美精品一区男女天堂| 一区二区三区伦理片| 婷婷综合激情| 午夜精品三级视频福利| 日韩电影在线观看一区二区| 激情都市一区二区| 韩国精品一区二区三区六区色诱| 毛片网站在线| 亚洲精品亚洲人成人网| 欧美色图色综合| 欧美成人黄色| 亚洲精品久久久久中文字幕欢迎你| 白白色免费视频| 欧美日韩第一区| 国产精品18久久久久久麻辣| 国产色综合视频| 久久综合网色—综合色88| 一区二区三区偷拍| 亚洲天堂电影| 538在线一区二区精品国产| 欲求不满的岳中文字幕| 天天影视欧美综合在线观看| 2024亚洲男人天堂| 国产精品久久久久久无人区| 99久久er热在这里只有精品15| 亚洲综合av一区| 免费h在线看| 欧美电影精品一区二区| 日本综合在线观看| 国产欧美日本| 91在线网站视频| 国产三级在线免费观看| 婷婷丁香激情综合| 国产精品熟女一区二区不卡| 精品国产91乱码一区二区三区四区 | 国产精品扒开腿做| 欧美 日韩 国产 成人 在线| 亚洲欧洲成人自拍| 妺妺窝人体色www在线观看| 成人偷拍自拍| 欧美日韩成人在线播放| 中文字幕日日夜夜| 久久久久久久久久电影| 日韩欧美不卡在线| 玖玖玖视频精品| 日韩中文综合网| 中文字幕免费视频观看| 久久综合国产精品| 欧美午夜小视频| 欧美日韩午夜电影网| 日韩视频亚洲视频| 欧美成人一区二区视频| 久久久久久久国产精品影院| 国产av天堂无码一区二区三区| 精品一区二区三区四区五区| 久久久www成人免费精品张筱雨| 最新中文字幕在线观看视频| 久久久久一区二区三区四区| 欧美网站免费观看| 色吊丝一区二区| 久久人人看视频| 国产综合视频在线| 亚洲va天堂va国产va久| 精品一区二区视频在线观看 | 欧美激情三级免费| 亚洲高清视频在线播放| 亚洲狼人国产精品| 人妻激情偷乱视频一区二区三区| 91精品一区国产高清在线gif | 国产精品乱码一区二三区小蝌蚪| 亚洲一二三区av| 日韩在线不卡| 成人一区二区电影| 亚洲婷婷噜噜| 亚洲成人999| 天堂中文在线网| 久久久久久久综合狠狠综合| 毛葺葺老太做受视频| 国产一区二区三区日韩精品| 国产精品一区二区电影| 东热在线免费视频| 欧美情侣在线播放| avtt天堂在线| av网站免费线看精品| 欧美网站免费观看| 成人在线免费观看91| 成人午夜小视频| a级网站在线播放| 欧美精品一区二区三区一线天视频| 天海翼一区二区| 国产亚洲成aⅴ人片在线观看| 网站一区二区三区| 欧美激情亚洲| 美女视频久久| 免费一级欧美在线观看视频| 欧美猛少妇色xxxxx| 亚洲 欧美 自拍偷拍| 欧美无乱码久久久免费午夜一区| 免费成年人视频在线观看| 成人在线视频首页| 亚洲熟妇av一区二区三区漫画| 精品欧美久久| 99在线高清视频在线播放| 免费在线小视频| 日韩在线精品一区| 天天射天天色天天干| 欧美亚洲动漫另类| 国产无遮挡又黄又爽| 久久精品夜色噜噜亚洲a∨| 亚洲欧美一区二区三区不卡| 亚洲在线黄色| 不卡中文字幕在线| 欧洲亚洲视频| 91免费在线视频| 欧美第一视频| 久99九色视频在线观看| 免费在线一级视频| 欧美α欧美αv大片| 亚洲av无码不卡| 亚洲成年人影院| 亚洲一二三在线观看| www亚洲一区| 丰满少妇一区二区三区专区| 日韩成人午夜精品| 日本福利视频一区| 图片小说视频色综合| 蜜桃成人在线| 永久免费精品视频| 成人性生交xxxxx网站| 国产精品久久久久av电视剧| 欧美放荡办公室videos4k| 亚洲成人三级| 亚洲欧美日韩中文视频| 日韩一区二区三区不卡| 91精品国产日韩91久久久久久| 国产一区二区视频免费| 午夜精品久久久久久久久| 日韩女优一区二区| 国产精品嫩草影院com| 波多野结衣办公室33分钟| 国产成人免费av在线| 午夜国产福利在线观看| 蜜臀精品一区二区三区在线观看 | 日韩大陆欧美高清视频区| 国产v片在线观看| 欧美乱熟臀69xxxxxx| 超碰在线97观看| 色综合一个色综合亚洲| 国产一区二区三区影院| 亚洲国产一二三| 欧美毛片在线观看| 一区二区成人在线视频| 粉嫩av性色av蜜臀av网站| 国产精品高潮呻吟| 99久久99久久精品免费看小说.| 国产视频一区二区在线| 国产精品无码午夜福利| 97精品久久久午夜一区二区三区| 人妻激情偷乱频一区二区三区| 国产精品99久久久| 亚洲熟女乱综合一区二区| 国产一区二区三区久久悠悠色av| 欧美视频国产视频| 精东粉嫩av免费一区二区三区| 黄色永久免费网站| 免费高清成人在线| 天堂在线一区二区三区| 国产精品一品视频| 韩国av中国字幕| 成人视屏免费看| 日韩片在线观看| 国产午夜精品在线观看| 色综合99久久久无码国产精品| 久久精品亚洲精品国产欧美| 国产精品酒店视频| 亚洲色图在线视频| 久久久国产精品人人片| 亚洲线精品一区二区三区| 日韩三级一区二区三区| 欧美特黄级在线| 最近中文字幕在线观看| 欧美一区二区二区| 亚洲精品久久久蜜桃动漫| 亚洲韩国欧洲国产日产av| 国产一区精品| 久久网福利资源网站| 国产亚av手机在线观看| 欧美一级淫片videoshd| 成人在线视频免费| 99理论电影网| 羞羞色国产精品网站| 五月婷婷一区| 欧美日韩福利| 日韩毛片在线免费看| 久久成人av少妇免费| 天堂va欧美va亚洲va老司机| 91免费视频网址| 成人高潮免费视频| 精品免费在线观看| 中文字幕人妻一区二区三区视频 | 午夜精品福利一区二区三区蜜桃| 亚洲图片在线视频| 欧美精品18+| 午夜视频在线免费播放| 日韩在线视频线视频免费网站| 欧美家庭影院| 国产精品久久久久久久久免费看 | 极品久久久久久| 精品久久香蕉国产线看观看亚洲| 中文字幕精品一区二| 精品乱码亚洲一区二区不卡| 黄色av免费在线看| 色综合久久久888| 欧美va在线观看| 国产乱码精品一区二区三区日韩精品| 加勒比久久综合| 丝袜人妻一区二区三区| 精品一区二区三区欧美| 国产三级视频网站| 一区二区三区在线观看视频| 一区二区乱子伦在线播放| 亚洲成人精品在线| 国产婷婷视频在线| 日韩av色在线| **爰片久久毛片| 三年中文高清在线观看第6集 | 一区二区成人在线视频 | 美国欧美日韩国产在线播放| 国产白嫩美女无套久久| 亚洲日本青草视频在线怡红院| 久久青青草原亚洲av无码麻豆| 91精品国产91久久综合桃花 | 亚洲一区二区免费在线观看| 亚洲欧洲日韩精品| 免费在线亚洲| 无码人妻精品一区二区三区99不卡| 一区在线播放视频| 日韩黄色片网站| 日韩精品在线免费| caoprom在线| 成人av免费电影| 91av精品| 不卡的在线视频| 日本一区二区成人在线| 天堂在线免费观看视频| 精品99久久久久久| 免费在线观看av电影| 91视频99| 欧美黄免费看| 性生活在线视频| 亚洲精品中文在线影院| 国产熟女精品视频| 久久亚洲精品一区二区| 香蕉久久一区| 超碰成人在线免费观看| 久久精品国产色蜜蜜麻豆| jizz18女人高潮| 欧美无乱码久久久免费午夜一区| 岛国最新视频免费在线观看| 国产精品99久久久久久久久| 禁断一区二区三区在线| 99草草国产熟女视频在线| 久久精品一区二区| 青娱乐在线免费视频| 在线观看日韩www视频免费| av亚洲一区| 中文字幕日韩精品一区二区| 久久国产精品99精品国产 | 国产欧美中文字幕| 欧美日韩一区二区三区视频播放| 日本xxxx黄色| 国产精品乱码久久久久久| 国产又爽又黄免费软件| 久久69精品久久久久久久电影好 | 成人欧美magnet| 日韩国产欧美一区| 日本va欧美va精品| 99热在线观看精品| 日韩免费福利电影在线观看| 美女航空一级毛片在线播放| 国内一区二区在线视频观看| 亚洲少妇自拍| 国产精久久一区二区三区| 欧美性做爰猛烈叫床潮| 国产理论在线观看| 国产精品国产一区二区| 久久成人一区| 91麻豆精品久久毛片一级| 日韩区在线观看| 午夜欧美激情| 亚洲在线欧美| 成人免费视频caoporn| 亚洲成人第一网站| 久久精品91久久久久久再现| youjizzjizz亚洲| 国产极品美女高潮无套久久久| 中文字幕亚洲在| 狠狠综合久久av一区二区| 国产精品久久久久久久久久尿| 91精品精品| 人妻少妇精品视频一区二区三区| 欧美日韩免费观看一区二区三区| 性欧美猛交videos| 久久综合九色综合网站| 韩国理伦片一区二区三区在线播放| 欧美亚洲天堂网| 中日韩美女免费视频网址在线观看 | 天美传媒免费在线观看| 日韩一级二级三级| 欧美大片免费观看网址| 国产精品无码电影在线观看| 久久精品一二三| 免费看黄色一级视频| 国产精品www|