国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于消息的事件驅(qū)動(dòng)機(jī)制(Message Based, Event Driven)

開(kāi)發(fā) 前端
基于消息的事件驅(qū)動(dòng)機(jī)制是一個(gè)通用模型,廣泛應(yīng)用于桌面軟件開(kāi)發(fā)、網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)、前端開(kāi)發(fā)等技術(shù)方向中。本文主要描述基本模型、基本框架,用于說(shuō)明不同技術(shù)的共性知識(shí)。

 [[414607]]

本文轉(zhuǎn)載自微信公眾號(hào)「一個(gè)程序員的修煉之路」,作者地下潛行者。轉(zhuǎn)載本文請(qǐng)聯(lián)系一個(gè)程序員的修煉之路公眾號(hào)。

1. 基本模型概述

基于消息的事件驅(qū)動(dòng)機(jī)制是一個(gè)通用模型,廣泛應(yīng)用于桌面軟件開(kāi)發(fā)、網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)、前端開(kāi)發(fā)等技術(shù)方向中。本文主要描述基本模型、基本框架,用于說(shuō)明不同技術(shù)的共性知識(shí)??梢岳斫鉃橥獠坎僮魇录?,被轉(zhuǎn)化為消息存放于隊(duì)列中;而每種類(lèi)型的消息都有對(duì)應(yīng)的處理;通過(guò)消息循環(huán),完成讀消息、調(diào)用消息處理這個(gè)過(guò)程。這個(gè)過(guò)程,只要應(yīng)用不退出,會(huì)一直進(jìn)行下去。下圖的模型從Windows應(yīng)用程序而來(lái),但是具有一定的通用性。

2. 模型在MFC程序中的應(yīng)用

MFC(Microsoft Foundation Classes)是微軟的基礎(chǔ)類(lèi)庫(kù),對(duì)大部分的Windows API進(jìn)行封裝,同時(shí)也是桌面軟件的UI開(kāi)發(fā)框架,下圖是一個(gè)用VS2019自動(dòng)生成的MFC多文檔應(yīng)用。不用做任何開(kāi)發(fā)工作,就可以得到一個(gè)自帶菜單欄、工具欄、狀態(tài)欄、屬性展示框等豐富的界面框架。不過(guò)現(xiàn)在MFC已經(jīng)沒(méi)落,除了歷史項(xiàng)目,已經(jīng)很少有新項(xiàng)目,采用MFC。下文會(huì)基于鼠標(biāo)點(diǎn)擊后完整的系統(tǒng)響應(yīng)過(guò)程,說(shuō)明該模型在MFC中的體現(xiàn)。

2.1 從鼠標(biāo)點(diǎn)擊到響應(yīng)處理的完整過(guò)程

1.用戶點(diǎn)擊鼠標(biāo);

2.鼠標(biāo)驅(qū)動(dòng)產(chǎn)生鼠標(biāo)點(diǎn)擊消息(通過(guò)中斷實(shí)現(xiàn)),進(jìn)行系統(tǒng)消息隊(duì)列;

3.系統(tǒng)消息轉(zhuǎn)換為應(yīng)用程序消息,放入應(yīng)用程序隊(duì)列;

4.消息泵從應(yīng)用程序消息隊(duì)列中讀取消息;

5.消息派發(fā)及處理,借助USER模塊,將消息派發(fā)至對(duì)應(yīng)窗口的對(duì)應(yīng)消息處理函數(shù);

問(wèn)題:為什么消息處理函數(shù)中不能做長(zhǎng)耗時(shí)的任務(wù)?

消息泵處理消息時(shí)是依次處理,處理完一條消息后,再處理下一條消息。如果當(dāng)前消息的處理事件過(guò)長(zhǎng),會(huì)導(dǎo)致后續(xù)的消息無(wú)法得到及時(shí)響應(yīng),會(huì)導(dǎo)致界面卡頓等非常不佳的用戶體驗(yàn)。

2.2 事件類(lèi)型

1) 鼠標(biāo)點(diǎn)擊(單擊、雙擊、右擊)

2) 鍵盤(pán)按鍵

3) 用戶在觸摸屏上的點(diǎn)擊事件

4) …

用戶在電腦上的各種操作,對(duì)應(yīng)到各種事件類(lèi)型、不同的事件類(lèi)型,會(huì)被轉(zhuǎn)換為不同的消息。

2.3 消息定義

用戶操作事件,會(huì)被轉(zhuǎn)化為消息。消息定義如下:

  1. /* 
  2.  * Message structure 
  3.  */ 
  4.    typedef struct tagMSG { 
  5.    HWND        hwnd;    //接受消息的窗口句柄 
  6.    UINT        message; //消息常量標(biāo)識(shí)符(消息號(hào)) 
  7.    WPARAM      wParam;  //32位消息特定附加信息 
  8.    LPARAM      lParam;  //32位消息特定附加信息 
  9.    DWORD       time;    //消息創(chuàng)建時(shí)的時(shí)間 
  10.    POINT       pt;      //消息創(chuàng)建時(shí)的光標(biāo)位置 
  11.    #ifdef _MAC 
  12.    DWORD       lPrivate; 
  13.    #endif 
  14.    } MSG 

微軟有提供一系列的消息定義,用戶也可以自定義消息,進(jìn)行應(yīng)用程序的開(kāi)發(fā)。

windows 消息類(lèi)型可以分為以下兩大類(lèi):

(1)系統(tǒng)消息:范圍在[0x0000,0x03ff]之間,細(xì)分為三小類(lèi):

  • 窗口消息:與窗口運(yùn)作有關(guān),窗口創(chuàng)建,窗口繪制,窗口移動(dòng),窗口銷(xiāo)毀;
  • 命令消息:一般指WM_COMMAND消息,與處理用戶請(qǐng)求有關(guān),通常由控件或者菜單產(chǎn)生。
  • 通知消息:特指WM_NOTIFY消息。通常指一個(gè)窗口內(nèi)的子控件發(fā)生了一些事情,需要通知父窗口。

微軟官方鏈接,給出了系統(tǒng)消息的范圍:

The system reserves message-identifier values in the range 0x0000 through 0x03FF (the value of WM_USER – 1) for system-defined messages. Applications cannot use these values for private messages.

(2)應(yīng)用定義的消息

  • WM_USER : 【0X0400-0X7FFF】, 用戶自定義的消息范圍。
  • WM_APP : 【0X8000-0XBFFF】,用于程序之間的消息通信。
  • RegisterWindowMessage :【0XC000-0XFFFF】

微軟官方內(nèi)容,給出了應(yīng)用消息的取值范圍:

Values in the range 0x0400 (the value of WM_USER) through 0x7FFF are available for message identifiers for private window classes.

If your application is marked version 4.0, you can use message-identifier values in the range 0x8000 (WM_APP) through 0xBFFF for private messages.

The system returns a message identifier in the range 0xC000 through 0xFFFF when an application calls the RegisterWindowMessage function to register a message. The message identifier returned by this function is guaranteed to be unique throughout the system. Use of this function prevents conflicts that can arise if other applications use the same message identifier for different purposes.

2.4 消息處理映射表(事件處理綁定)

消息處理映射表指每個(gè)消息對(duì)應(yīng)的處理函數(shù)。只有先做好映射表,當(dāng)消息到達(dá)時(shí),消息泵才知道怎么處理該消息。

2.4.1 Win32應(yīng)用程序中的消息處理映射表

WndProc為消息處理函數(shù),代碼內(nèi)部通過(guò)switch case,給不同的消息指定不同的處理函數(shù)。

  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
  2.     switch (message) 
  3.     { 
  4.     case WM_COMMAND: 
  5.         { 
  6.             int wmId = LOWORD(wParam); 
  7.             // 分析菜單選擇: 
  8.             switch (wmId) 
  9.             { 
  10.             case IDM_ABOUT: 
  11.                 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); 
  12.                 break; 
  13.             case IDM_EXIT: 
  14.                 DestroyWindow(hWnd); 
  15.                 break; 
  16.             default
  17.                 return DefWindowProc(hWnd, message, wParam, lParam); 
  18.             } 
  19.         } 
  20.         break; 
  21.     case WM_PAINT: 
  22.         { 
  23.             PAINTSTRUCT ps; 
  24.             HDC hdc = BeginPaint(hWnd, &ps); 
  25.             // TODO: 在此處添加使用 hdc 的任何繪圖代碼... 
  26.             EndPaint(hWnd, &ps); 
  27.         } 
  28.         break; 
  29.     case WM_DESTROY: 
  30.         PostQuitMessage(0); 
  31.         break; 
  32.     default
  33.         return DefWindowProc(hWnd, message, wParam, lParam); 
  34.     } 
  35.     return 0; 

2.4.2 MFC中的消息處理映射表

在如下代碼中可以看到,WINDOWS消息WM_CREATE,對(duì)應(yīng)的消息處理函數(shù)為OnCreate.當(dāng)消息到達(dá)時(shí),消息泵知道去調(diào)用OnCreate函數(shù)。

宏BEGIN_MESSAGE_MAP,END_MESSAGE_MAP就是用于定義消息映射表的。

  1. BEGIN_MESSAGE_MAP(CFileView, CDockablePane) 
  2.   ON_WM_CREATE() 
  3.   ... 
  4. END_MESSAGE_MAP() 
  5.  
  6. #define ON_WM_CREATE() \ 
  7.   { WM_CREATE, 0, 0, 0, AfxSig_is, \ 
  8.     (AFX_PMSG) (AFX_PMSGW) \ 
  9.     (static_cast< int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT) > ( &ThisClass :: OnCreate)) }, 

2.5 消息泵(Windows應(yīng)用程序)

消息泵負(fù)責(zé)從應(yīng)用程序的消息隊(duì)列中讀取消息、轉(zhuǎn)換消息、派發(fā)消息。

  1. MSG msg; 
  2.  
  3.  // 主消息循環(huán): 
  4. while (GetMessage(&msg, nullptr, 0, 0)) 
  5.      if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
  6.      { 
  7.          TranslateMessage(&msg); 
  8.          DispatchMessage(&msg); 
  9.      } 

以上出現(xiàn)的函數(shù)都是Windows API 函數(shù)

  • GetMessage 從消息隊(duì)列中讀取消息
  • TranslateMessage 消息翻譯、轉(zhuǎn)換。
  • DispatchMessage 派發(fā)消息、找到消息對(duì)應(yīng)的窗口、調(diào)用響應(yīng)函數(shù)

2.6 消息隊(duì)列

(1)系統(tǒng)消息隊(duì)列:這是系統(tǒng)唯一隊(duì)列,設(shè)備驅(qū)動(dòng)把用戶的操作輸入轉(zhuǎn)化成消息存放于系統(tǒng)隊(duì)列中,然后系統(tǒng)會(huì)把此消息放到目標(biāo)窗口所在的線程消息隊(duì)列中等待處理。

(2)線程消息隊(duì)列:每一個(gè)GUI線程都會(huì)維護(hù)一個(gè)線程消息隊(duì)列,然后線程消息隊(duì)列中的消息會(huì)被送到相應(yīng)的窗口過(guò)程處理。

消息隊(duì)列并不可以直接訪問(wèn),但是我們可以通過(guò)指定接口去訪問(wèn)消息隊(duì)列。

  • PostMessage函數(shù),用于向消息隊(duì)列中追加消息,并立即返回;
  • GetMessage函數(shù),用于從消息隊(duì)列中讀取消息;

2.7 Windows消息攔截機(jī)制

上文介紹Windows消息的產(chǎn)生、讀取、派發(fā)處理等,其實(shí)用戶可以通過(guò)Windows的消息攔截機(jī)制,對(duì)消息到達(dá)目標(biāo)窗體之前進(jìn)行提前處理。這主要通過(guò)Windows的Hook機(jī)制實(shí)現(xiàn)。常用的調(diào)試工具SPY++,就是利用HOOK機(jī)制截獲窗口消息。

此處只做介紹,不做詳細(xì)深入。

2.8 模態(tài)對(duì)話框和非模態(tài)對(duì)話框的區(qū)別

模態(tài)對(duì)話框:在子界面活動(dòng)期間,父窗口是無(wú)法進(jìn)行消息響應(yīng)。獨(dú)占用戶輸入

  • 非模態(tài)對(duì)話框:各窗口之間不影響。
  • 模態(tài)對(duì)話框通過(guò)在消息循環(huán)內(nèi)再造消息循環(huán)。如果當(dāng)前窗口內(nèi)的消息循環(huán)不退出,父窗口的消息循環(huán)將無(wú)法運(yùn)轉(zhuǎn),也即無(wú)法響應(yīng)。從而產(chǎn)生模態(tài)對(duì)話框獨(dú)占響應(yīng)的效果。

3. 模型在瀏覽器中的應(yīng)用

在網(wǎng)頁(yè)應(yīng)用程序開(kāi)發(fā)中(前端開(kāi)發(fā)),用戶的點(diǎn)擊操作產(chǎn)生事件,同時(shí)在網(wǎng)頁(yè)應(yīng)用程序中進(jìn)行處理響應(yīng)。瀏覽器應(yīng)用,同樣適用于該模型。

3.1 事件類(lèi)型

1)用戶在某個(gè)元素上點(diǎn)擊鼠標(biāo)或懸停光標(biāo)。

2)用戶在鍵盤(pán)中按下某個(gè)按鍵。

3)用戶調(diào)整瀏覽器的大小或者關(guān)閉瀏覽器窗口。

4)提交表單。

5)…

完整的瀏覽器事件清單,可以參考如下鏈接:

https://developer.mozilla.org/en-US/docs/Web/Events

3.2 事件綁定

在如下示例中,對(duì)HTML的DOM元素中進(jìn)行事件綁定,增加了click事件響應(yīng)。當(dāng)用戶點(diǎn)擊該div的時(shí)候,響應(yīng)函數(shù)就會(huì)執(zhí)行。瀏覽器中有多種事件綁定方式,此處只用addEventListener,作為示例說(shuō)明。

3.3 事件傳播

用戶在點(diǎn)擊div后,事件會(huì)按照 捕獲階段、目標(biāo)階段、冒泡階段的過(guò)程進(jìn)行處理。用戶可以通過(guò)addEventListener中useCapture字段,決定事件的捕獲階段。

  • true - 捕獲階段執(zhí)行事件響應(yīng)函數(shù)
  • false- 冒泡階段執(zhí)行事件響應(yīng)函數(shù)

3.4 事件循環(huán)

事件循環(huán)之所以稱(chēng)之為事件循環(huán),是因?yàn)樗?jīng)常按照類(lèi)似如下的方式來(lái)被實(shí)現(xiàn):

  1. while (queue.waitForMessage()) { 
  2.   queue.processNextMessage(); 

queue.waitForMessage() 會(huì)同步地等待消息到達(dá)(如果當(dāng)前沒(méi)有任何消息等待被處理)。

該段內(nèi)容來(lái)自于鏈接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop

3.5 任務(wù)隊(duì)列

Javascript腳本的執(zhí)行環(huán)境是單線程的,所以必定存在一個(gè)任務(wù)隊(duì)列用于依次存放待響應(yīng)任務(wù)。即3.4章節(jié)中的queue.

4. 模型在網(wǎng)絡(luò)應(yīng)用程序中的應(yīng)用

4.1 點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)應(yīng)用程序工作過(guò)程

一個(gè)服務(wù)端角色,一個(gè)客戶端角色的兩個(gè)進(jìn)程之間建立通信的完成過(guò)程,如下文所述。

4.1.1 服務(wù)端

1)創(chuàng)建SOCKET;

2)綁定IP:Port;

3)SOCKET進(jìn)入監(jiān)聽(tīng)模式;

4)等待外部連接請(qǐng)求進(jìn)入,如果有,建立連接;

5)數(shù)據(jù)讀寫(xiě)處理;

6)處理結(jié)束,關(guān)閉連接。

4.1.2 客戶端

1)創(chuàng)建SOCKET;

2)向指定的IP:Port發(fā)起連接請(qǐng)求,并建立連接;

3)發(fā)送數(shù)據(jù)/接收數(shù)據(jù);

4)處理結(jié)束,關(guān)閉連接。

問(wèn)題:當(dāng)一臺(tái)機(jī)器有10W,乃至更多的并發(fā)網(wǎng)絡(luò)連接,如何處理?

一個(gè)線程處理一個(gè)SOCKET連接?(大量的線程,會(huì)導(dǎo)致CPU資源花在線程切換上,而不是真正的有效工作)

通過(guò)SELECT周期性輪詢所有SOCKET,檢查是否可讀、可寫(xiě)?(主動(dòng)遍歷所有SOCKET集合,當(dāng)SOCKET基數(shù)特別大、活躍量少的時(shí)候,低效。SELECT本身也有數(shù)量限制)

通過(guò)事件通知,只處理活躍的局部少量SOCKET (參考CPU中斷處理、高效)

4.2事件清單

網(wǎng)絡(luò)應(yīng)用程序中存在一些基本的事件以及圍繞這些事件開(kāi)展的處理。在陳碩的書(shū)籍《Linux多線程服務(wù)器端編程》有介紹三個(gè)半事件。

1)連接建立,包含服務(wù)端接收新連接、客戶端發(fā)起連接;

2)連接斷開(kāi),包括主動(dòng)斷開(kāi)、被動(dòng)斷開(kāi);阿

3)消息到達(dá),表示有數(shù)據(jù)到緩沖區(qū),可以讀,拷貝到用戶自己控制的緩沖區(qū)中;

4)消息發(fā)送完畢,算半個(gè)事件。

開(kāi)發(fā)人員應(yīng)針對(duì)指定事件,開(kāi)發(fā)對(duì)應(yīng)的處理函數(shù),并通過(guò)引擎完成事件處理。

4.3 事件處理引擎

目前操作系統(tǒng)層面提供了高效的網(wǎng)絡(luò)通信處理機(jī)制,不同的語(yǔ)言也提供了各種類(lèi)庫(kù)。

4.3.1 操作系統(tǒng)層支持

1)Windows IOCP

2)CentOS Epoll

3)xxxBSD kqueue

4.3.2 語(yǔ)言層面的框架支持

1)C/C++ libevent/Muduo/Asio/…

2)Java Netty

3)DotNet DotNetty

4.3.3 Epoll機(jī)制說(shuō)明

1)創(chuàng)建Epoll實(shí)例句柄:可以理解為管理其他socket的領(lǐng)頭羊;

2)事件注冊(cè):為每個(gè)SOCKET要關(guān)注的事件進(jìn)行注冊(cè),服務(wù)端監(jiān)聽(tīng)SOCKET

主要關(guān)注有沒(méi)有新的連接進(jìn)來(lái);

一般性SOCKET關(guān)注是否有數(shù)據(jù)進(jìn)來(lái),需要讀取;

超時(shí),事件處理;

3)進(jìn)入等待狀態(tài),有事件進(jìn)來(lái)時(shí),操作系統(tǒng)會(huì)進(jìn)行通知;

4)事件處理,根據(jù)操作系統(tǒng)的通知,應(yīng)用程序進(jìn)行反饋,調(diào)用對(duì)應(yīng)事件的處理函數(shù)進(jìn)行響應(yīng)。

由于操作系統(tǒng)層面的支持,系統(tǒng)反饋時(shí),只對(duì)活躍的SOCKET進(jìn)行處理,數(shù)據(jù)量少,檢查量少,處理量也少。因此可以處理大量socket并發(fā)。

能夠這么做,是因?yàn)榫W(wǎng)絡(luò)應(yīng)用程序進(jìn)行數(shù)據(jù)收發(fā),必然存在網(wǎng)絡(luò)延遲,所以才可以這么處理。如果每個(gè)SOCKET都是滿負(fù)荷運(yùn)作,那么這種機(jī)制也不

能用于大量的連接處理。

4.3.4 Muduo網(wǎng)絡(luò)庫(kù)說(shuō)明

Muduo是由陳碩編寫(xiě)的,基于Epoll,采用Reactor模式開(kāi)發(fā)的開(kāi)源網(wǎng)絡(luò)通信庫(kù)。

Reactor模式稱(chēng)為反應(yīng)堆模型,是指有一個(gè)循環(huán)的過(guò)程,不斷監(jiān)聽(tīng)對(duì)應(yīng)事件是否觸發(fā),事件觸發(fā)時(shí)調(diào)用對(duì)應(yīng)的 callback 進(jìn)行處理。

如下圖所示:

所有的客戶端連接請(qǐng)求事件都由acceptor處理,并建立新的連接;

所有已建立的連接,按照讀數(shù)據(jù)、解碼、處理、編碼、數(shù)據(jù)發(fā)送返回的過(guò)程進(jìn)行處理。其中數(shù)據(jù)讀寫(xiě),由反應(yīng)堆根據(jù)事件進(jìn)行處理。

Muduo的詳細(xì)說(shuō)明,可以參考如下文檔:

https://www.cyhone.com/articles/analysis-of-muduo/

4.3.5 基于Muduo的網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)模式

1)建立一個(gè)事件循環(huán)器EventLoop(也可以理解為消息泵)

2)建立對(duì)應(yīng)的服務(wù)器TcpServer

3)設(shè)置TcpServer的Callback(可以理解為建立事件處理映射表)

4)啟動(dòng)server

5)開(kāi)啟事件循環(huán),進(jìn)行事件處理。

此處的消息隊(duì)列,可以理解為由操作系統(tǒng)返回的待處理SOCKET及其對(duì)應(yīng)事件的清單。

5. 總結(jié)

通過(guò)上文可以看出,在不同的技術(shù)方向上,其實(shí)是可以挖掘出通性技術(shù),并進(jìn)行學(xué)習(xí)的。因此我做了如下歸納:

1)不同技術(shù),采用類(lèi)似設(shè)計(jì)思路

2)研究共性,便于知識(shí)觸類(lèi)旁通

3)細(xì)節(jié)差異,通過(guò)工程實(shí)踐掌握

6. 參考資料

1. 微軟官方關(guān)于消息及其隊(duì)列的介紹: https://docs.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues#application-defined-messages

2. Muduo細(xì)節(jié): https://github.com/chenshuo/muduo

責(zé)任編輯:武曉燕 來(lái)源: 一個(gè)程序員的修煉之路
相關(guān)推薦

2017-08-16 10:36:10

JavaScriptNode.js事件驅(qū)動(dòng)

2012-06-27 14:40:57

事件驅(qū)動(dòng)擴(kuò)展

2013-03-28 16:12:12

Message機(jī)制應(yīng)用

2011-07-04 14:50:49

QT Event 事件

2023-09-27 08:01:14

數(shù)據(jù)推送事件

2013-12-24 10:05:04

memcached

2023-12-28 07:57:27

2021-06-09 07:55:19

NodeEventEmitte驅(qū)動(dòng)

2022-09-29 08:19:24

數(shù)據(jù)庫(kù)運(yùn)維D-SMART

2017-01-04 18:29:20

AndroidNestedScrol嵌套滑動(dòng)機(jī)制

2023-05-09 08:36:58

DuchesneWindows

2023-02-19 12:44:07

領(lǐng)域事件DDD

2023-02-26 10:59:51

2025-05-20 07:13:22

Spring異步解耦Event

2013-03-26 14:17:21

架構(gòu)架構(gòu)設(shè)計(jì)事件驅(qū)動(dòng)

2011-05-31 11:55:00

Android 消息機(jī)制

2012-01-04 13:19:46

網(wǎng)絡(luò)

2023-04-28 15:20:37

JavaScript事件循環(huán)

2019-10-11 09:00:00

JavaScriptEvent Loop前端

2009-10-20 14:58:15

Javascript事
點(diǎn)贊
收藏

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

在线欧美亚洲| 国产精品日产欧美久久久久| 欧美性资源免费| 超碰97国产精品人人cao| 亚洲视频每日更新| 国产三级三级三级看三级| 国产呦萝稀缺另类资源| 国产尤物99| 欧美一区综合| 成人免费自拍视频| 免费一区二区三区视频导航| 韩国三级电影久久久久久| 日韩精品免费视频一区二区三区| 亚洲欧洲国产伦综合| sm久久捆绑调教精品一区| 日韩一区二区三区在线| 欧美性天天影视| 欧美一区二区高清| mm1313亚洲国产精品美女| 91精品综合久久久久久| 国产在线一区二区视频| 精品久久久久久久久久久久久久久| 国产一区久久精品| 亚洲精品一线二线三线| 亚洲精品永久免费视频| 国产亚洲精品一区二555| 日本综合久久| 久久91精品国产91久久跳| 视频欧美一区| 欧洲日本亚洲国产区| 日韩极品在线| 亚洲va电影大全| 国产精品日韩久久久| 欧美一区二区三区成人久久片 | 伊人久久青草| 国产精品中文有码| www.黄色网址.com| 国产色婷婷亚洲99精品小说| 激情av网站| 欧美日韩精品一区二区三区蜜桃 | 91精品短视频| 国产欧美一区二区三区四区| 亚洲国产一区二区精品专区| 一级全黄肉体裸体全过程| 成人av电影在线| 免费看av大片| 欧美三级视频在线| 日本免费久久| 亚洲第一成年网| 97国产在线| 午夜精品福利久久久| 免费成人看片网址| 日本成人超碰在线观看| 波多野结衣之无限发射| 不卡的av影片| 亚洲成年人在线播放| 亚洲成人毛片| 成人网欧美在线视频| 蜜桃视频在线观看一区二区| 亚洲成熟丰满熟妇高潮xxxxx| 婷婷中文字幕一区三区| 99re6在线精品视频免费播放| 不卡毛片在线看| 亚洲综合自拍| 成人一区二区av| 亚洲动漫第一页| 黄在线观看免费网站ktv| 欧美俄罗斯性视频| 国产一区视频在线观看免费| 久久在线中文字幕| 精品国产31久久久久久| 欧洲一级精品| 99re热精品| 成人午夜av电影| 邻居大乳一区二区三区| 中文字幕精品av| 欧美午夜电影在线观看| 国产精品wwwww| 91精品国产福利在线观看| 香蕉成人app| 色视频一区二区三区| 亚洲人精品午夜| 少妇视频在线观看| 亚洲在线免费看| 久久久国产精品麻豆| 黄色网页在线观看| 日本精品免费一区二区三区| 韩日精品视频一区| 视频一区二区在线播放| 色综合亚洲精品激情狠狠| 欧美二区视频| 97操碰视频| 亚洲美女自拍视频| 一区在线免费| 色资源网在线观看| 久久免费视频网站| 成人免费视频app| 成全电影大全在线观看| 99国内精品久久久久久久软件| 国产三级精品三级| 日韩美女在线看免费观看| 就去色蜜桃综合| 日韩欧美在线免费| 一本久久青青| 欧美激情成人网| 国产一区二区三区丝袜| 香蕉精品999视频一区二区| 在线免费av网址| 欧美一级在线亚洲天堂| 久久色在线观看| 成人精品电影在线| 色综合影院在线观看| 欧美日韩1234| 亚洲精品1234| 婷婷在线视频| 黑人中文字幕一区二区三区| 色综合久久天天| 亚洲最新av| 在线视频se| 成人免费网视频| 亚洲v中文字幕| 日韩精品免费一区二区在线观看| 成人漫画网站免费| 欧美激情亚洲一区| av不卡一区二区三区| 中国一级黄色录像| 色悠悠久久88| 日韩精品免费专区| 黄色小网站在线观看| 成人av影视在线| 狠狠色狠色综合曰曰| 久久亚洲专区| 青青九九免费视频在线| 国产精品美女久久久久久久久| 蜜桃视频在线观看免费视频| 亚洲人成网站在线观看播放| 亚洲精品一区二区三区蜜桃下载| 日韩成人伦理电影在线观看| 9lporm自拍视频区在线| 中文字幕一区二区三区5566| 亚洲欧美国产另类| 99re这里只有精品6| 超碰成人在线观看| 羞羞在线观看网站| 国产suv精品一区二区三区88区| 国产精品国产三级国产aⅴ入口| 婷婷精品在线观看| 屁屁影院在线观看| 国产精品av一区| 日韩一区二区三区在线视频| 国产曰批免费观看久久久| 色狠狠一区二区三区| 97在线免费| caoporen国产精品| 亚洲成人a级网| 26uuu另类欧美亚洲曰本| 中文精品一区二区| 91精彩视频在线播放| 亚洲精品永久www嫩草| 中文综合在线观看| 亚洲欧美在线另类| 欧美日韩岛国| 国产三级电影在线播放| 午夜肉伦伦影院| 国产精品吹潮在线观看| 欧美浪妇xxxx高跟鞋交| 懂色av中文字幕一区二区三区| 综合久久成人| 国产黄在线播放| 欧洲精品在线播放| 国产成人aa精品一区在线播放| 欧洲一区在线电影| 国产精品自拍一区| 亚洲成a人片77777在线播放| 日本成人在线播放| 99福利在线观看| 91免费欧美精品| 亚洲精品视频免费在线观看| 国产日韩成人精品| 国产一区二区三区四区三区四| 偷拍精品精品一区二区三区| 欧美xx网站| 亚洲资源视频| 国产91精品高潮白浆喷水| 在线播放中文一区| 欧美成人黑人| 欧美丰满熟妇xxxxx| 国产精品区免费视频| 色婷婷成人综合| 欧洲一区二区三区免费视频| 91网站在线播放| 国产一区二区高清| 欧美理伦片在线播放| 麻豆91在线| 免费的av电影| 亚洲色图都市激情| 444亚洲人体| 欧美精品激情在线| 欧美精品一区二区三区视频| 亚洲午夜免费福利视频|