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

解密 SSE,像 ChatGPT 一樣返回流式響應(yīng)

開(kāi)發(fā) 前端
當(dāng)完成握手之后,后續(xù)傳輸?shù)臄?shù)據(jù)就不再是 HTTP 報(bào)文,而是 WebSocket 格式的二進(jìn)制幀。所以這兩者完全是不同的協(xié)議,那有沒(méi)有一種辦法,我們?nèi)匀皇褂?HTTP 協(xié)議,同時(shí)還能讓服務(wù)端主動(dòng)推送數(shù)據(jù)呢?

我們知道目前的 HTTP/1.1 采用的是標(biāo)準(zhǔn)的請(qǐng)求-響應(yīng)模型,客戶端主動(dòng)發(fā)請(qǐng)求,服務(wù)端被動(dòng)地返回響應(yīng)。這種模型在客戶端需要實(shí)時(shí)獲取結(jié)果的場(chǎng)景下是不合適的,因?yàn)檫@意味著客戶端需要不斷地輪詢,所以最好的做法是服務(wù)端生成結(jié)果之后,主動(dòng)推送給客戶端。

比如 ChatGPT,它在生成內(nèi)容時(shí),也是生成一部分,就主動(dòng)向客戶端推送一部分。而在這個(gè)過(guò)程中,客戶端不需要做任何事情,只需等待 ChatGPT 服務(wù)端返回內(nèi)容即可。

說(shuō)到這兒,你肯定想到了 WebSocket,沒(méi)錯(cuò)這是一種解決方案。但 WebSocket 太重了,它和 HTTP 都是基于 TCP 的應(yīng)用層傳輸協(xié)議,只不過(guò)在握手的時(shí)候搭了 HTTP 的便車(chē),利用 HTTP 本身的協(xié)議升級(jí)特性,偽裝成 HTTP,這樣就能繞過(guò)瀏覽器沙箱、網(wǎng)絡(luò)防火墻等限制。

當(dāng)完成握手之后,后續(xù)傳輸?shù)臄?shù)據(jù)就不再是 HTTP 報(bào)文,而是 WebSocket 格式的二進(jìn)制幀。所以這兩者完全是不同的協(xié)議,那有沒(méi)有一種辦法,我們?nèi)匀皇褂?HTTP 協(xié)議,同時(shí)還能讓服務(wù)端主動(dòng)推送數(shù)據(jù)呢?

答案是有的,也就是本文將要介紹的 SSE 技術(shù),它的英文全稱(chēng)是 Server-Sent Events(服務(wù)端推送事件)。通過(guò) SSE 可以讓服務(wù)端即時(shí)推送數(shù)據(jù)到客戶端,而不需要客戶端輪詢服務(wù)端以獲取更新。

圖片圖片

到這你可能會(huì)問(wèn),那 WebSocket 和 SSE 有什么區(qū)別呢?

1)通信方式

WebSocket 提供全雙工通信,服務(wù)端和客戶端都可以在同一個(gè)連接上同時(shí)發(fā)送和接收數(shù)據(jù)。最重要的是,WebSocket 獨(dú)立于 HTTP 協(xié)議,盡管它開(kāi)始于一個(gè) HTTP 握手。

SSE 僅提供服務(wù)端到客戶端的單向通信,客戶端不能通過(guò) SSE 給服務(wù)端發(fā)信息。

2)協(xié)議和實(shí)現(xiàn)

WebSocket 使用自己的協(xié)議(ws:// 或 wss://),需要服務(wù)端和客戶端都支持,并且協(xié)議比較復(fù)雜。

SSE 則是使用標(biāo)準(zhǔn)的 HTTP 協(xié)議,實(shí)現(xiàn)起來(lái)更簡(jiǎn)單,尤其是在服務(wù)端。

3)適用場(chǎng)景

WebSocket 適用于服務(wù)端和客戶端之間雙向?qū)崟r(shí)通信的場(chǎng)景,如在線游戲、聊天應(yīng)用等。

SSE 適用于服務(wù)端向客戶端單向推送數(shù)據(jù)的場(chǎng)景,如消息通知、數(shù)據(jù)更新。并且 SSE 自動(dòng)支持?jǐn)嗑€重連,而 WebSocket 則需要額外部署。

4)復(fù)雜性和資源使用

WebSocket 由于其雙向通信的能力,通常比 SSE 更復(fù)雜,可能需要更多的資源來(lái)維護(hù)和管理連接。

SSE 因?yàn)槠鋯蜗蛐院突?HTTP 的特性,它可以利用現(xiàn)有的網(wǎng)絡(luò)基礎(chǔ)設(shè)施,如代理服務(wù)器、負(fù)載均衡器和防火墻等等,通常更容易實(shí)現(xiàn)和維護(hù)。


相信現(xiàn)在你已經(jīng)明白 SSE 是做什么的了,它的目的就是讓服務(wù)端能夠主動(dòng)推送數(shù)據(jù)給客戶端。如果不需要和服務(wù)端動(dòng)態(tài)交互,只是希望服務(wù)端在有數(shù)據(jù)的時(shí)候推過(guò)來(lái),那么 WebSocket 就有些太重了,因?yàn)檫@意味著要替換 HTTP 協(xié)議,而使用 SSE 無(wú)疑是更好的選擇。

SSE 是什么我們已經(jīng)知道了,那它是怎么實(shí)現(xiàn)的呢?原理是什么呢?

1)建立連接

客戶端發(fā)起一個(gè)標(biāo)準(zhǔn)的 HTTP 請(qǐng)求來(lái)開(kāi)啟 SSE 會(huì)話,這個(gè)請(qǐng)求的特殊之處在于它包含一個(gè)頭字段。

Accept: text/event-stream

相當(dāng)于客戶端告訴服務(wù)端,期望接收 SSE 消息流。而服務(wù)端在看到該字段時(shí),也知道這是一個(gè) SSE 請(qǐng)求,于是立即向客戶端返回響應(yīng)頭,注意:返回的只有響應(yīng)頭,里面會(huì)包含如下頭字段。

Content-Type: text/event-stream

響應(yīng)頭返回之后標(biāo)志著 SSE 連接成功建立,并且連接會(huì)保持開(kāi)放狀態(tài),服務(wù)端后續(xù)可以隨時(shí)通過(guò)此連接向客戶端發(fā)送數(shù)據(jù)。此外當(dāng)連接不小心斷開(kāi)時(shí),客戶端也會(huì)自動(dòng)進(jìn)行重連。

所以在普通的 HTTP 請(qǐng)求中,一旦服務(wù)端返回,那么請(qǐng)求結(jié)束了。雖然可以將 Connection 頭字段設(shè)置為 keep-alive 保證連接不斷開(kāi),但每次訪問(wèn)都包含了 HTTP 請(qǐng)求/響應(yīng)的完整過(guò)程。

而在 SSE 中,服務(wù)端會(huì)保持一個(gè)開(kāi)放的連接,只要有新數(shù)據(jù)可用,就會(huì)直接發(fā)送給客戶端。所以服務(wù)端會(huì)將響應(yīng)以流的形式發(fā)送給客戶端,每次發(fā)送的消息都是響應(yīng)流的一部分,而不是獨(dú)立的 HTTP 響應(yīng)。

因此 SSE 的服務(wù)端在發(fā)送數(shù)據(jù)時(shí),并不遵循傳統(tǒng)的一次請(qǐng)求,一次響應(yīng)模式。它在建立連接之后會(huì)保持連接開(kāi)放,并通過(guò)這個(gè)持續(xù)的連接流式地發(fā)送數(shù)據(jù),這種方式就使得 SSE 非常適合實(shí)時(shí)數(shù)據(jù)推送的場(chǎng)景。

2)發(fā)送消息

客戶端發(fā)送請(qǐng)求,服務(wù)端返回響應(yīng)頭之后,SSE 連接就建立成功了。此時(shí)客戶端只需要躺平,安靜地等待服務(wù)端的輸出即可。所以現(xiàn)在的關(guān)鍵就在于服務(wù)端要返回什么格式的數(shù)據(jù)呢?很簡(jiǎn)單,一個(gè)基本的消息由以下幾部分組成:

  • data:實(shí)際的消息數(shù)據(jù);
  • id:可選,消息的唯一標(biāo)識(shí)符,用于在連接重新建立時(shí)同步消息;
  • event:可選,定義事件類(lèi)型,用于客戶端區(qū)分消息的類(lèi)型;
  • retry:可選,自動(dòng)重連的時(shí)間(毫秒),如果連接中斷,客戶端在自動(dòng)重新連接之前,需要等待多長(zhǎng)時(shí)間;

注意:每個(gè)消息要以兩個(gè)換行符(\n\n)結(jié)束,舉個(gè)例子,我們發(fā)送一個(gè) Hello World。

data: Hello World\n\n

也可以發(fā)送帶有事件類(lèi)型的消息:

event: userUpdate
data: {"username": "Serpen", "age": 18}\n\n

還是比較簡(jiǎn)單的,服務(wù)端可以保持連接并隨時(shí)發(fā)送更多數(shù)據(jù)。然后客戶端在收到時(shí)會(huì)進(jìn)行處理,但不需要(也不能)對(duì)服務(wù)端作出任何回應(yīng),它只需要被動(dòng)地接收來(lái)自服務(wù)端的數(shù)據(jù)即可。當(dāng)服務(wù)端認(rèn)為數(shù)據(jù)已經(jīng)全部發(fā)送完畢、無(wú)需再發(fā)時(shí),那么便可以主動(dòng)斷開(kāi)連接。

關(guān)于 SSE 的原理我們就解釋清楚了,下面來(lái)實(shí)際編程實(shí)現(xiàn)它,這里我們先使用原生的 asyncio 實(shí)現(xiàn) SSE。

import asyncio
from asyncio import StreamReader, StreamWriter

class SSE:

    def __init__(self, host="0.0.0.0", port=9999):
        self.host = host
        self.port = port

    @staticmethod
    def parse_request_headers(data: bytes) -> dict:
        """
        此函數(shù)負(fù)責(zé)從原始字節(jié)流中解析出請(qǐng)求頭
        """
        headers = data.split(b"\r\n\r\n")[0].split(b"\r\n")
        header_dict = {}
        for header in headers[1:]:
            key, val = header.decode("utf-8").split(":", 1)
            header_dict[key.lower()] = val.strip()
        return header_dict

    async def handler_requests(self,
                               reader: StreamReader,
                               writer: StreamWriter):
        """
        負(fù)責(zé)處理來(lái)自客戶端的請(qǐng)求
        每來(lái)一個(gè)客戶端連接,就會(huì)基于此函數(shù)創(chuàng)建一個(gè)協(xié)程
        并且自動(dòng)傳遞兩個(gè)參數(shù):reader 和 writer
        reader.read  負(fù)責(zé)讀取數(shù)據(jù),等價(jià)于 socket.recv
        writer.write 負(fù)責(zé)發(fā)送數(shù)據(jù),等價(jià)于 socket.send
        """
        # 獲取客戶端的請(qǐng)求報(bào)文,這里對(duì)請(qǐng)求方法、請(qǐng)求地址不做限制
        data = await reader.readuntil(b"\r\n\r\n")
        # 解析出請(qǐng)求頭
        request_headers = self.parse_request_headers(data)
        # 簡(jiǎn)單檢測(cè)一下 accept 字段,如果不是建立 SSE,那么直接關(guān)閉連接
        if request_headers.get("accept") != "text/event-stream":
            writer.close()
            return await writer.wait_closed()
        # 如果是 SSE 連接,那么返回響應(yīng)頭
        response_header = (
            b"HTTP/1.1 200 OK\r\n"
            b"Content-Type: text/event-stream\r\n"
            b"Cache-Control: no-cache\r\n"
            b"Connection: keep-alive\r\n"
            b'Access-Control-Allow-Origin: *\r\n'
            b"\r\n"
        )
        writer.write(response_header)
        await writer.drain()

        # 然后便可以不斷地向客戶端返回?cái)?shù)據(jù)了
        for _ in range(5):
            # 每隔 1 秒返回?cái)?shù)據(jù)
            data = "data: 高老師總能分享出好東西\r\n\r\n".encode("utf-8")
            writer.write(data)
            await writer.drain()
            await asyncio.sleep(1)
        # 數(shù)據(jù)傳輸完畢
        writer.close()
        await writer.wait_closed()

    async def __create_server(self):
        # 創(chuàng)建服務(wù),第一個(gè)參數(shù)是一個(gè)回調(diào)函數(shù)
        # 當(dāng)連接過(guò)來(lái)的時(shí)候就會(huì)根據(jù)此函數(shù)創(chuàng)建一個(gè)協(xié)程
        # 后面是綁定的 ip 和 端口
        server = await asyncio.start_server(self.handler_requests,
                                            self.host,
                                            self.port)
        # 然后開(kāi)啟無(wú)限循環(huán)
        async with server:
            await server.serve_forever()

    def run_server(self):
        loop = asyncio.get_event_loop()
        loop.run_until_complete(self.__create_server())

if __name__ == '__main__':
    sse = SSE()
    sse.run_server()

服務(wù)端代碼編寫(xiě)完畢,下面編寫(xiě)前端代碼。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #data {
            font-weight: bold;
            color: cadetblue;
            font-size: large;
        }
    </style>
</head>
<body>
    <h1>SSE Test</h1>
    <div id="data"></div>
    <script>
        document.addEventListener("DOMContentLoaded", function () {
            // 和服務(wù)端建立 SSE 連接
            var eventSource = new EventSource("http://localhost:9999");

            eventSource.onmessage = function (e) {
                // 將數(shù)據(jù)渲染在 <div id="data"></div> 的內(nèi)部
                var data = e.data + "\n";
                document.getElementById('data').innerText += data;
            };

            eventSource.onerror = function (e) {
                console.error('Error occurred:', e);
                eventSource.close();
            };
        });
    </script>
</body>
</html>

代碼編寫(xiě)完畢,我們用瀏覽器打開(kāi) HTML 文件,便可看到如下效果。

圖片圖片

以上我們就簡(jiǎn)單實(shí)現(xiàn)了 SSE,當(dāng)然為了加深印象,這里的后端是使用原生的 asyncio 編寫(xiě)的,但在工作中,我們會(huì)使用現(xiàn)成的 Web 框架,比如 FastAPI,Blacksheep 等等。

需要說(shuō)明的是,雖然通過(guò) SSE 技術(shù)可以實(shí)現(xiàn)類(lèi)似 ChatGPT 的效果,但 ChatGPT 內(nèi)部并沒(méi)有用到 SSE,它內(nèi)部是基于 HTTP 的分塊傳輸實(shí)現(xiàn)的。因?yàn)?SSE 只能通過(guò) GET 請(qǐng)求發(fā)出,并且無(wú)法自定義請(qǐng)求頭。

如果想實(shí)現(xiàn) ChatGPT 的效果,需要使用 HTTP 的分塊傳輸。而像 FastAPI、BlackSheep 等框架提供的流式響應(yīng),便是基于 HTTP 的分塊傳輸實(shí)現(xiàn)的,比如 FastAPI:

import asyncio
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from fastapi.middleware.cors import CORSMiddleware
import uvicorn

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

async def event_generator():
    for _ in range(5):
        # 每隔 1 秒返回?cái)?shù)據(jù)
        data = "data: 高老師總能分享出好東西\r\n\r\n".encode("utf-8")
        yield data
        await asyncio.sleep(1)

@app.get("/")
async def sse():
    return StreamingResponse(event_generator(), 
                             media_type="text/event-stream")

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=9999)

首先之前的前端代碼依舊可以正常訪問(wèn),通過(guò)修改數(shù)據(jù)格式和 Content-Type 可以讓其支持 SSE。但最正確的做法是直接訪問(wèn) localhost:9999,效果如下:

圖片圖片

所以基于 StreamingResponse 可以實(shí)現(xiàn) SSE,也可以直接訪問(wèn)。而直接訪問(wèn)的話,此時(shí)里面的 data: 和 \r\n 就是實(shí)體數(shù)據(jù)的一部分。并且這種方式和 ChatGPT 的工作機(jī)制是相似的,都使用了 HTTP 的分塊傳輸,支持所有的請(qǐng)求方法,而 SSE 只支持 GET 請(qǐng)求。

BlackSheep 也是類(lèi)似的,它同樣也支持流式響應(yīng)。

import asyncio
from blacksheep import Application, Response, StreamedContent
import uvicorn

app = Application()
app.use_cors(
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

async def event_generator():
    for _ in range(5):
        # 每隔 1 秒返回?cái)?shù)據(jù)
        data = "data: 高老師總能分享出好東西\r\n\r\n".encode("utf-8")
        yield data
        await asyncio.sleep(1)

@app.router.get("/")
async def sse():
    return Response(
        200,
        cnotallow=StreamedContent(b"text/event-stream", event_generator),
    )

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=9999)

可以測(cè)試一下,效果是一樣的。如果你不想實(shí)現(xiàn) SSE,只是希望固定的數(shù)據(jù)以流的形式一點(diǎn)一點(diǎn)返回,那么記得將數(shù)據(jù)中多余的 data: 和 \r\n 給去掉,并最好修改 Content-Type 為合適的類(lèi)型。

所以 SSE 一般用于需要服務(wù)端推數(shù)據(jù),但數(shù)據(jù)不知道什么時(shí)候會(huì)過(guò)來(lái),于是通過(guò) SSE 保持連接開(kāi)放。后續(xù)當(dāng)服務(wù)端有數(shù)據(jù)了,直接通過(guò)連接發(fā)送給客戶端即可。

而 FastAPI 和 BlackSheep 提供的流式響應(yīng)更像是,返回的數(shù)據(jù)比較龐大,如果全部準(zhǔn)備好再一次性返回,會(huì)讓用戶陷入長(zhǎng)時(shí)間的等待,造成不好的體驗(yàn)。于是通過(guò)分塊傳輸,準(zhǔn)備好一部分就返回一部分。雖然整體時(shí)間沒(méi)變,但可以讓用戶立刻獲取到數(shù)據(jù),從而提升用戶體驗(yàn)。

比如 ChatGPT,當(dāng)它回答的內(nèi)容比較多的時(shí)候,那么整個(gè)過(guò)程耗費(fèi)幾十秒鐘是常有的事情,假設(shè) 30 秒。相比讓用戶等待 30 秒,然后內(nèi)容一下子刷出來(lái),顯然生成一部分返回一部分這種方式更讓人喜歡。

因此使用 SSE 還是流式響應(yīng),則取決于你當(dāng)前的業(yè)務(wù)。如果你返回的數(shù)據(jù)是確定的,只是準(zhǔn)備的時(shí)間比較長(zhǎng),或者數(shù)據(jù)量比較大,那么推薦使用流式響應(yīng)。

至于 SSE,在這些現(xiàn)成的 Web 框架里面,也可以通過(guò)流式響應(yīng)來(lái)實(shí)現(xiàn),只需要將 Content-Type 設(shè)置為 text/event-stream,并將數(shù)據(jù)加上前綴 data: 和后綴 \r\n\r\n。

但說(shuō)實(shí)話,如果想實(shí)現(xiàn) SSE,不建議通過(guò)流式響應(yīng)來(lái)實(shí)現(xiàn),而是使用專(zhuān)門(mén)的庫(kù)。以 FastAPI 為例:

from sse_starlette.sse import EventSourceResponse

FastAPI 其實(shí)就是在 starlette 的基礎(chǔ)上套了一層殼,通過(guò)安裝 sse_starlette 可以讓 FastAPI 更好地支持 SSE。

以上就是本文的內(nèi)容,如果對(duì)你有幫助,就點(diǎn)個(gè)贊吧。

責(zé)任編輯:武曉燕 來(lái)源: 古明地覺(jué)的編程教室
相關(guān)推薦

2021-08-12 06:08:15

CSS 技巧組件狀態(tài)

2023-04-05 14:19:07

FlinkRedisNoSQL

2013-12-17 09:02:03

Python調(diào)試

2023-05-23 13:59:41

RustPython程序

2022-12-21 15:56:23

代碼文檔工具

2013-12-31 09:19:23

Python調(diào)試

2021-05-20 08:37:32

multiprocesPython線程

2013-08-22 10:17:51

Google大數(shù)據(jù)業(yè)務(wù)價(jià)值

2015-03-16 12:50:44

2015-02-05 13:27:02

移動(dòng)開(kāi)發(fā)模塊SDK

2011-01-18 10:45:16

喬布斯

2012-06-08 13:47:32

Wndows 8Vista

2023-02-23 15:35:14

人工智能ChatGPT聊天機(jī)器人

2024-04-01 00:05:00

ChatGPTSSE

2021-12-14 19:40:07

Node路由Vue

2025-09-12 00:00:00

DevToolsJavaScript調(diào)試術(shù)

2021-09-07 10:29:11

JavaScript模塊CSS

2017-05-22 10:33:14

PythonJuliaCython

2012-03-21 10:15:48

RIM越獄

2023-08-09 09:33:01

ChatGPT流式網(wǎng)絡(luò)
點(diǎn)贊
收藏

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

精品国产三区在线| 婷婷成人激情| 日产欧产美韩系列久久99| 自拍视频国产精品| 最新日本中文字幕| 88xx成人永久免费观看| 亚洲欧美激情视频在线观看一区二区三区| 亚洲xxxx18| 中文字字幕在线中文| 国产精品久久久久蜜臀| 亚洲精品二三区| 午夜精品久久久久久久99热影院| 菠萝蜜视频在线观看www入口| 久久免费视频色| 91视频99| 伊人久久国产精品| 亚洲少妇在线| 欧美大片va欧美在线播放| 成都免费高清电影| 97人人澡人人爽91综合色| 日本久久电影网| 美女av免费观看| 在线毛片网站| 国内精品国产成人国产三级粉色 | 91麻豆精品国产91久久久久久| 97干在线视频| 成人在线直播| 国产精品嫩草久久久久| 国产亚洲一区在线播放| 国产精品乱码久久久| 蜜桃视频一区| 精品动漫一区二区三区在线观看| 国产91av视频在线观看| 亚洲日本国产精品| 成人黄色a**站在线观看| 91在线高清视频| 在线观看视频二区| 日本亚洲欧美天堂免费| 国产91精品不卡视频| 毛片aaaaa| 久久久久久久久久久妇女| 国产一区二区三区中文| 久久精品老司机| 另类ts人妖一区二区三区| 日韩免费视频线观看| 午夜剧场高清版免费观看| 88xx成人免费观看视频库 | 五月天婷婷激情视频| 国产不卡123| 亚洲已满18点击进入久久| 激情图片qvod| 91网址在线观看| 亚洲欧美日韩精品久久久久| 亚洲一区二区三区精品动漫| 91在线品视觉盛宴免费| 国产精品午夜电影| 一区二区三区四区不卡| 男人的天堂在线视频免费观看| 国产精品情趣视频| 在线精品日韩| av软件在线观看| 亚洲影院免费观看| www插插插无码视频网站| 波多野结衣精品| 午夜久久福利影院| 亚洲国产精品久久久久婷蜜芽| 日韩美女一级视频| 97精品国产露脸对白| 你懂的视频在线一区二区| 免费在线毛片| 国产精品嫩草影院av蜜臀| 99亚洲精品视频| 黑人极品ⅴideos精品欧美棵| 午夜精品久久久久久久久久久 | 亚洲 欧美 国产 另类| 欧美第一精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 免费看一级一片| 羞羞视频在线观看欧美| 国产精品美女呻吟| www.国产精品视频| 久久综合久久综合九色| 亚洲国产日韩综合一区| 97影院秋霞午夜在线观看| 亚洲成人精品在线观看| 国产无套粉嫩白浆内谢的出处| 成人精品一区二区三区电影| 日韩一区二区三区观看| 熟妇人妻久久中文字幕| 波多野结衣的一区二区三区 | 日韩电影毛片| 欧美日韩你懂的| av漫画在线观看| 精品黄色一级片| 色综合视频网站| 69视频免费看| 国产精品1区二区.| 欧美精品在线一区| 色呦呦久久久| 91激情五月电影| 亚洲熟妇一区二区| 欧美日韩性在线观看| 欧美成人激情视频| 懂色av蜜臀av粉嫩av分享吧最新章节| 国产一区二区三区精品视频| 免费看成人午夜电影| av在线free| 欧美性感一区二区三区| 亚洲午夜久久久久久久久| 日本大胆欧美| 2019日本中文字幕| 性生活视频软件| 日本一区二区免费在线| 男人添女人下面高潮视频| 国产精品日本一区二区不卡视频| 亚洲欧美国产精品va在线观看| 一起操在线播放| 亚洲欧美网站| 国产伦理一区二区三区| 午夜在线观看视频| 在线观看免费成人| 国产精品边吃奶边做爽| 国产精品二区影院| 91久久精品日日躁夜夜躁国产| 可以在线观看的av| 精品电影在线观看| 亚洲精品乱码久久久久久蜜桃欧美| 久久精品播放| 国产精品草莓在线免费观看| 香蕉久久国产av一区二区| 亚洲中国最大av网站| 青青草久久伊人| 日韩国产一区二区| 国产精品国产三级国产aⅴ9色| 外国精品视频在线观看 | 中文字幕一精品亚洲无线一区 | 四虎成人永久免费视频| 粉嫩嫩av羞羞动漫久久久| 日韩精品第1页| 亚洲欧洲日韩精品在线| 色婷婷**av毛片一区| 免费在线不卡av| 国产欧美日韩在线视频| 六月激情综合网| 久久99性xxx老妇胖精品| 68精品久久久久久欧美| 视频二区在线| 日韩欧美a级成人黄色| a视频免费观看| 国产精品久久777777毛茸茸| 国内外成人免费视频| caoporn视频在线观看| 亚洲第一视频网站| 九九热在线视频播放| 91蜜桃婷婷狠狠久久综合9色| 国产深夜男女无套内射| 亚洲国产精品嫩草影院久久av| 国产91精品高潮白浆喷水| 午夜成人免费影院| 色欧美片视频在线观看| 91成人精品一区二区| 麻豆国产一区二区| 国产对白在线播放| 99精品中文字幕在线不卡 | 亚洲成人1区| 久久影视免费观看| 六月婷婷综合网| 欧美性极品xxxx娇小| 精品黑人一区二区三区观看时间| 午夜一区不卡| 亚洲乱码国产乱码精品天美传媒| 日韩第二十一页| 欧美高清在线观看| 女人天堂在线| 欧美日本不卡视频| 国产主播在线播放| 久久久三级国产网站| 亚洲综合av在线播放| 欧美视频亚洲视频| 欧美黑人xxxxx| 中文字幕日韩亚洲| 午夜精品在线视频| 99re在线视频| 精品久久久三级丝袜| 日韩一级在线视频| 亚洲免费av网站| 黄色a一级视频| 久久av资源网| 色综合久久久久无码专区| 日韩综合精品| 国内精品一区二区| 欧美综合社区国产| 538国产精品一区二区免费视频 | 亚洲嫩草精品久久| 成年人网站免费看| 国产一区二区三区综合| 欧美成人xxxxx| 亚洲激情五月| 日本黑人久久| 99精品国产一区二区三区2021| 国产高清视频一区三区| 日日夜夜天天综合入口| 亚洲人成电影网站| 亚洲精品久久久久avwww潮水| 色丁香久综合在线久综合在线观看| 日本中文在线视频| 久久精品视频在线看| 毛茸茸free性熟hd| 国产在线精品视频| 亚洲欧美另类动漫| 一本色道久久综合亚洲精品不卡| 一区二区不卡在线观看| 蜜桃精品wwwmitaows| www.成人av| 国产91欧美| 国产999视频| aa国产成人| 欧美高清在线播放| bestiality新另类大全| 中文字幕在线观看亚洲| 欧美日韩伦理片| 亚洲国产一区自拍| www.色日本| 日韩三级视频中文字幕| 91麻豆国产在线| 欧美日韩免费不卡视频一区二区三区| 看片网址国产福利av中文字幕| 亚洲综合激情网| 翔田千里88av中文字幕| 国产精品九色蝌蚪自拍| 国产传媒国产传媒| 久久亚洲一区二区三区明星换脸| 性猛交╳xxx乱大交| 国产麻豆精品一区二区| 999久久久精品视频| 美日韩一级片在线观看| 妓院一钑片免看黄大片| 日韩中文字幕亚洲一区二区va在线| aa在线观看视频| 亚洲美女视频在线免费观看| 久久精品xxx| 亚洲网站在线| 欧美一级欧美一级| 亚洲国产高清视频| av免费观看大全| 亚洲精品欧美| 日韩在线一级片| 久久精品亚洲一区二区| 欧美综合在线观看视频| 青青青爽久久午夜综合久久午夜| 午夜dv内射一区二区| 蜜臀av亚洲一区中文字幕| 日日躁夜夜躁aaaabbbb| 精久久久久久久久久久| 成人性生交视频免费观看| 国产一区二区三区综合| 中文字幕无人区二| 99久久综合99久久综合网站| 在线观看国产三级| 久久精品欧美一区二区三区麻豆 | 青青一区二区三区| 先锋在线资源一区二区三区| 色88久久久久高潮综合影院| 三年中文高清在线观看第6集| 欧美精品91| 人人干视频在线| 日韩精品成人一区二区在线| 中国黄色片免费看| 国产成人精品一区二区三区四区| 亚洲精品激情视频| 久久精品一区二区| 久久成人小视频| 亚洲国产wwwccc36天堂| 亚洲图片在线视频| 欧美绝品在线观看成人午夜影视| 国产男女猛烈无遮挡| 亚洲福利精品在线| 韩国中文免费在线视频| 久久亚洲精品一区| 色在线中文字幕| 国产在线一区二区三区| 97久久亚洲| 神马欧美一区二区| 国产综合久久| 天堂在线资源视频| 高清国产一区二区| www.黄色在线| 亚洲一级二级在线| 最近中文字幕免费在线观看| 日韩欧美亚洲国产精品字幕久久久| 五月婷婷深深爱| 久久精品国产亚洲一区二区| 999av小视频在线| 国产人妖伪娘一区91| 成人搞黄视频| 一本色道久久综合亚洲二区三区| 欧美色123| 国产精品人人爽人人爽| zzijzzij亚洲日本少妇熟睡| www.日本高清视频| 亚洲成人激情自拍| 一二三四区在线| 精品一区二区三区四区在线| 黄色小网站在线观看| 欧美在线视频网站| 亚洲专区**| 日本黄色a视频| 老妇喷水一区二区三区| zjzjzjzjzj亚洲女人| 国产精品久久久久精k8| 天堂网av手机版| 日韩欧美国产精品一区| 成人午夜电影在线观看| 97久久精品人人澡人人爽缅北| 亚洲精品tv| 日韩成人av电影在线| 在线不卡视频| 初高中福利视频网站| 国产精品无圣光一区二区| 丁香六月婷婷综合| 亚洲高清免费观看高清完整版| 国产原创精品视频| 国产噜噜噜噜久久久久久久久| 视频一区欧美| 内射国产内射夫妻免费频道| 国产99久久久国产精品潘金网站| 婷婷激情四射网| 欧美日韩免费在线视频| av在线收看| 国产精品久久久久久久久久| 欧美a一欧美| 日日摸日日碰夜夜爽无码| 国产成人在线视频网址| 国产高潮国产高潮久久久91| 欧美日韩国产综合一区二区| 高清国产福利在线观看| 日韩免费在线免费观看| 亚洲精品aaaaa| 亚洲国产精品久久久久爰色欲| 成人av网站免费观看| 日韩精品成人一区| 亚洲国产成人av在线| 人在线成免费视频| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 日日噜噜噜噜夜夜爽亚洲精品| 久久综合亚州| 怡红院一区二区三区| 欧美性大战久久久久久久 | 久久久久久久久国产| 99这里只有精品视频| 久久亚洲精品无码va白人极品| 丁香婷婷综合网| 色播视频在线播放| 日韩成人在线免费观看| 亚洲妇女成熟| 日本一区二区在线视频| 美腿丝袜亚洲色图| 国产a免费视频| 亚洲国产精品成人精品| 黄毛片在线观看| 欧洲一区二区在线| 久久99国产精品尤物| 黑鬼狂亚洲人videos| 亚洲成人精品av| 在线能看的av网址| 亚洲欧美日韩精品综合在线观看| 理论片日本一区| 欧美日韩在线观看成人| 亚洲国产精品久久久久久| 成人线上视频| 一区二区视频在线免费| 国产91富婆露脸刺激对白| 欧美一区二区激情视频| 中文精品99久久国产香蕉| 久久天堂久久| 99精品在线免费视频| 亚洲国产激情av| 亚洲第一第二区| 欧美最顶级的aⅴ艳星| 欧美a级片视频| 国产av一区二区三区传媒| 色爱区综合激月婷婷| 成人黄视频在线观看| 国内精品**久久毛片app| 日本aⅴ精品一区二区三区 | 国产美女av在线| 精品视频导航| 久久草av在线| 好吊妞视频一区二区三区| 色婷婷综合久久久久| 国产亚洲精品美女久久| 在线免费视频a| 亚洲国产人成综合网站| 在线观看二区| 国产一区国产精品| 精品亚洲国产成人av制服丝袜| 黄色激情视频在线观看| 日韩在线观看网站| 欧美影院天天5g天天爽| 激情文学亚洲色图|