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

ESFramework4.0文件傳送 如此簡單

開發 后端
ESFramework 作為通信框架的核心,定義了消息處理的骨架流程,提供了多種通信引擎實現,相對單純而穩定。本文主要介紹ESFramework 在文件傳送方面的便捷,一起來看。

ESFramework,是一套可高度復用的、靈活的、單純而又強大的.NET通信框架,全部采用C#編寫。ESFramework內置了對Tcp和Udp的支持,并且支持文本協議和流協議,提供了多種網絡引擎供服務端和客戶端開發人員輕松使用。采用ESFramework框架,使得您不需要了解Socket、不用再關心底層與通信相關的一切瑣碎的事情,就可以在一個更高的層次上更快地開發屬于您的高效穩定的網絡通信應用。像IM系統、視頻會議系統、數據采集系統等,凡是需要分布式通信的系統都可以使用ESFramework框架。

一.ESPlus的文件傳送流程

ESPlus定義了文件傳送的標準流程,可以用下圖表示:

 

(1)由發送方發起傳送文件的請求。

(2)接收方回復同意或者拒絕接收文件。如果拒收,則流程結束;否則進入下一步。

(3)發送方發送文件數據,接收方接收文件數據。

(4)如果文件傳送過程中,接收方或發送方掉線或者取消文件傳送,則文件傳送被中斷,流程結束。如果文件傳送過程一直正常,則到***完成文件的傳送。

有幾點需要說明一下:

(1)發送方可以是客戶端,也可以是服務器;接收方也是如此。但無論發送方和接收方的類別如何,它們都遵守這一文件傳送流程;就像ESFramework所有的通信引擎都公用同一套消息處理骨架流程一樣。

(2)當接收方同意接收后,框架會自動搜索是否存在匹配的續傳項目,若存在,則會啟動斷點續傳。當然,我們可以通過文件接收管理器的屬性來控制斷點續傳功能是否開啟。關于斷點續傳的更多內容,可以參考ESFramework 4.0 文件斷點續傳原理與實現。

(3)進行文件傳送的線程是由框架自動控制的,只要發送方收到了接收方同意接收的回復,框架就會自動在后臺線程中發送文件數據包;同樣,此時接收方也會自動處理接收到的文件數據包。

(4)發送方或接收方都可隨時取消正在傳送的文件。

(5)當文件傳送被中斷或完成時,發送方和接收方都會有相應的事件通知。

 

二.ESPlus用于支持文件傳送的基礎設施

1.TransmittingFileInfo

無論是發送方還是接收方,針對每個文件傳送任務,都需要有個對象來表示它,TransmittingFileInfo便是一個文件傳送項目的封裝,里面包含了類似發送者ID、接收者ID、文件名稱等相關信息。

 

TransmittingFileInfo的大部分屬性對于發送方和接收方都是有效的,而有幾個屬性只對發送方有效(比如SendingFileParas),有幾個屬性只對接收方有效(如LocalSaveFilePath),這些在幫助文檔中都有詳細的說明。而且,有些屬性(如OriginFileLastUpdateTime)的存在是用于支持斷點續傳功能的。

 

2.FileTransDisrupttedType

ESPlus使用FileTransDisrupttedType枚舉定義了所有可能導致文件傳送中斷的原因:

 

  1. public enum FileTransDisrupttedType  
  2. {  
  3. /// <summary>  
  4. /// 自己主動取消  
  5. /// </summary>  
  6. ActiveCancel,  
  7. /// <summary>  
  8. /// 對方取消  
  9. /// </summary>  
  10. DestCancel,  
  11. /// <summary>  
  12. /// 對方掉線  
  13. /// </summary>  
  14. DestOffline,  
  15. /// <summary>  
  16. /// 網絡中斷、自己掉線  
  17. /// </summary>  
  18. SelfOffline,  
  19. /// <summary>  
  20. /// 對方拒絕接收文件  
  21. /// </summary>  
  22. DestReject,  
  23. /// <summary>  
  24. /// 其它原因,如文件讀取失敗等  
  25. /// </summary>  
  26. OtherCause  
  27. }  

 

3.IFileTransferingEvents 接口

ESPlus定義了IFileTransferingEvents接口,用于暴露所有與文件傳送相關的狀態和事件:

 

  1. public interface IFileTransferingEvents  
  2. {  
  3. /// <summary>  
  4. /// 當某個文件開始傳送時,觸發該事件。  
  5. /// </summary>  
  6. event CbGeneric<TransmittingFileInfo> FileTransStarted;  
  7. /// <summary>  
  8. /// 當某個文件續傳開始時,觸發該事件。(將不再觸發FileTransStarted事件)  
  9. /// </summary>  
  10. event CbGeneric<TransmittingFileInfo> FileResumedTransStarted;  
  11. /// <summary>  
  12. /// 文件傳送的進度。參數為fileID(文件編號) ,total(文件大小) ,transfered(已傳送字節數)  
  13. /// </summary>  
  14. event CbFileSendedProgress FileTransProgress;   
  15. /// <summary>  
  16. /// 文件傳送中斷時,觸發該事件。  
  17. /// </summary>  
  18. event CbGeneric<TransmittingFileInfo, FileTransDisrupttedType> FileTransDisruptted;  
  19. /// <summary>  
  20. /// 文件傳送完成時,觸發該事件。  
  21. /// </summary>  
  22. event CbGeneric<TransmittingFileInfo> FileTransCompleted;   

通過預定這些事件,我們可以知道每個傳送的文件什么時候開始(或斷點續傳)、什么時候完成、傳遞的實時進度、傳送中斷的原因等等。要注意的是,這些事件都是在后臺線程中觸發的,如果在事件處理函數中需要更新UI,則需要將調用轉發到UI線程。

 

4.SendingFileParas

該對象僅僅包含兩個屬性:SendingSpanInMSecs和FilePackageSize。發送方可以通過SendingFileParas對象來指定發送文件數據包時的頻率與每個數據包的大小。一般來說,為了達到最快的傳送速度,SendingSpanInMSecs可以設為0。而FilePackageSize的大小則要根據發送方與接收方的網絡環境的好壞進行決定,在Internet上,一般可以設為2048或4096左右;而在局網內,可以設為204800甚至更大(在局網的傳送速度可以達到30M/s以上)。

 

5.IFileController

通過ESPlus.Application.FileTransfering.IFileController接口,我們可以提交發送文件的請求,并且可以主動取消正在接收或發送的文件。IFileController即可用于客戶端也可用戶服務端。

 

  1. public interface IFileController  
  2. {  
  3. /// <summary>  
  4. /// 該事件接口暴露了所有正在發送文件的實時狀態。  
  5. /// </summary>  
  6. IFileTransferingEvents FileSendingEvents { get; }  
  7. /// <summary>  
  8. /// 該事件接口暴露了所有正在接收的文件的實時狀態。  
  9. /// </summary>  
  10. IFileTransferingEvents FileReceivingEvents { get; }  
  11. /// <summary>  
  12. /// 準備發送文件。如果對方同意接收,則后臺會自動發送文件;如果對方拒絕接收,則會取消發送。  
  13. /// 如果要發送的文件不存在或被占用,則將拋出對應的異常。  
  14. /// </summary>   
  15. /// <param name="accepterID">接收文件的用戶ID</param>  
  16. /// <param name="filePath">被發送文件的路徑</param>  
  17. /// <param name="comment">其它附加備注。如果是在類似FTP的服務中,該參數可以是保存文件的路徑</param>   
  18. /// <param name="fileID">返回即將發送文件的唯一編號</param>  
  19. void BeginSendFile(string accepterID, string filePath, string comment, out string fileID);  
  20. /// <summary>  
  21. /// 準備發送文件。如果對方同意接收,則后臺會自動發送文件;如果對方拒絕接收,則會取消發送。  
  22. /// 如果要發送的文件不存在或被占用,則將拋出對應的異常。  
  23. /// </summary>  
  24. /// <param name="accepterID">接收文件的用戶ID</param>  
  25. /// <param name="filePath">被發送文件的路徑</param>  
  26. /// <param name="comment">其它附加備注。如果是在類似FTP的服務中,該參數可以是保存文件的路徑</param>  
  27. /// <param name="paras">發送參數設定。傳入null,表示采用IFileSenderManager的默認設置。</param>  
  28. /// <param name="fileID">返回即將發送文件的唯一編號</param>  
  29. void BeginSendFile(string accepterID, string filePath, string comment,SendingFileParas paras, out string fileID);  
  30. /// <summary>  
  31. /// 主動取消正在發送或接收的文件,并通知對方。  
  32. /// </summary>   
  33. void CancelFileTransfering(string fileID);   
  34. /// <summary>  
  35. /// 取消與某個用戶相關的正在傳送項目。  
  36. /// </summary>   
  37. /// <param name="destUserID">目標用戶ID。</param>  
  38. void CancelFileTransferingAbout(string destUserID);   
  39. /// <summary>  
  40. /// 獲取正在發送或接收中的文件的相關信息。  
  41. /// </summary>   
  42. TransmittingFileInfo GetFileInfo(string fileID);  

(1)BeginSendFile用于向接收方提交發送文件的請求,如果對方同意,則后臺會自動開始傳遞文件。該方法有個out參數fileID,用于傳出標記該文件傳送項目的唯一編號,比如,你打算將同一個文件發送給兩個好友,將會調用兩次BeginSendFile方法,而兩次得到的fileID是不一樣的。也就是說,fileID是用于標記文件傳送項目的,而不是標記文件的。

該方法有兩個重載,區別在于第二個BeginSendFile方法多了一個SendingFileParas參數,用于主動控制文件數據包的大小和發送頻率。

在客戶端使用時,BeginSendFile方法不僅可以向其他在線用戶提交發送文件的請求,也可以直接向服務器提交發送文件的請求 -- 即此時文件的接收者為服務端。我們只需要將accepterID參數傳入NetServer.SystemUserID,以指明由服務端而不是其他用戶來接收即將發送的文件。

(2)GetFileInfo方法可以獲取任何一個正在發送或正在接收的項目信息。

(3)CancelFileTransfering方法用于取消正在發送或接收的某個文件傳送項目,調用該方法時,框架會自動通知文件傳送的另一端用戶,并觸發FileReceivingEvents或FileSendingEvents中的FileTransDisruptted事件,而另一端也會自動觸發FileTransDisruptted事件。

(4)CancelFileTransferingAbout方法用于取消與某個指定用戶相關的正在傳送項目。比如,我們正在與aa01用戶聊天,并且與aa01有多個文件正在傳送,此時,如果要關閉與aa01的聊天窗口,那么關閉之前,通常會先調用CancelFileTransferingAbout方法來取消與aa01相關的所有文件傳送。所以你經常會看到類似的提示:“您與aa01有文件正在傳送中,關閉當前窗口將導致正在傳送的文件中斷,您確定要關閉嗎?”。如果用戶確認關閉,此時就正是我們要調用CancelFileTransferingAbout方法的時候了。

(5)FileSendingEvents屬性用于暴露自己作為發送者的所有正在進行的文件傳送項目的實時狀態;FileReceivingEvents屬性用于暴露自己作為接收者的所有正在進行的文件傳送項目的實時狀態。

 

6.IFileHandler

IFileHandler接口將被框架回調以實現文件傳送機制。同IFileController一樣,其既可用于客戶端也可用戶服務端。

我們需要實現ESPlus.Application.FileTransfering.IFileHandler接口來獲取與文件傳送請求相關通知:

 

  1. public interface IFileBusinessHandler : IBusinessHandler  
  2. {   
  3. /// <summary>  
  4. /// 是否同意接收文件?  
  5. /// </summary>   
  6. /// <param name="senderID">發送者的ID。如果為NetServer.SystemUserID,則表示是服務端發送的。</param>  
  7. /// <param name="fileName">文件名稱。</param>  
  8. /// <param name="fileLength">文件大小。</param>  
  9. /// <param name="comment">其它附加備注。如果是在類似FTP的服務中,該參數可以是保存文件的路徑</param>  
  10. /// <param name="fileID">文件ID。</param>  
  11. /// <param name="resumedFileItem">如果能續傳,則不為null。</param>  
  12. /// <returns>返回值為保存文件的路徑,如果為null,表示拒絕接收/拒絕續傳文件。如果參數resumedFileItem不為null,而且返回路徑等于resumedFileItem.LocalFileSavePath,則表示續傳;否則表示另存。</returns>  
  13. string ReadyToAcceptFile(string senderID, string fileName, long fileLength, string comment, string fileID, ResumedFileItem resumedFileItem);   
  14. /// <summary>  
  15. /// 接收者對自己發送文件請求的回復 -- 同意/拒絕接收。  
  16. /// </summary>  
  17. /// <param name="info">文件傳送項目的相關信息</param>  
  18. /// <param name="agreed">對方是否同意</param>  
  19. void OnResponseOfReceiver(TransmittingFileInfo info ,bool agreed);  

(1)ReadyToAcceptFile方法是當前用戶作為接收方時被框架回調的;而OnResponseOfReceiver方法是當前用戶作為發送方時,被框架回調的。

(2)IFileHandler接口的兩個方法都將在后臺線程中被框架調用,如果實現該方法時需要刷新應用程序的UI,則注意一定要轉發到UI線程。

(3)當發送方提交了發送文件的請求后,框架會在接收方回調ReadyToAcceptFileAsyn方法以詢問是否同意接收,如果同意,ReadyToAcceptFileAsyn應返回有效的存儲接收文件的路徑,否則,返回null。

(4)當接收方同意或拒絕接收文件,框架會在發送方回調OnResponseOfReceiver方法以通知發送者。通常,應用程序在實現OnResponseOfReceiver方法時,最多只需要告知文件發送者,而不需要再做任何其它的額外處理。因為框架已經幫你打理好了一切。

當接收方同意接收文件后,與該文件傳送項目相關的事件會通過IFileOutter暴露的IFileTransferingEvents接口相繼觸發。

#p#

 

三.客戶端

同ESPlus的Basic應用或CustomizeInfo應用一樣,在客戶端支持文件傳送功能也需要使用到相應的“Outter”組件和實現相應的“BusinessHandler”接口。

1.IFileOutter

 

  1. ESPlus.Application.FileTransfering.Passive.IFileOutter接口從IFileController繼承,并增加了一個屬性和一個方法:  
  2. public interface IFileOutter : IOutter ,IFileController  
  3. {  
  4. /// <summary>  
  5. /// 發送文件數據包時所采用的消息優先級。  
  6. /// </summary>  
  7. DataPriority DataPriority4SendingFile { getset; }  
  8. /// <summary>  
  9. /// 初始化文件傳送查看器控件。  
  10. /// </summary>  
  11. /// <param name="viewer">文件傳送查看器控件對象</param>  
  12. /// <param name="destUserID">目標用戶的ID。返回的查看器將顯示與該用戶相關的所有文件傳送狀態。如果傳入null,則顯示與任何用戶的文件傳送的實時狀態。</param>  
  13. void InitializeFileTransferingViewer(FileTransferingViewer viewer, string destUserID);  

(1)我們可以通過設置DataPriority4SendingFile屬性以控制發送文件數據包的優先級,在一般系統中,可以將其設置為Common或Low,但絕不能設置為CanBeDiscarded,否則將可能導致接收方接收到的文件不完整。

(2)ESPlus提供了默認的傳送項目的狀態查看器控件FileTransferingViewer,如果沒有特殊需求,大家在項目中可以直接使用它來顯示文件傳送的實時狀態,它的界面截圖如下所示:

 

你只需要把這個控件拖拽到你的UI上,然后將其傳入IFileOutter的InitializeFileTransferingViewer方法進行初始化后,它就會正常工作了。

InitializeFileTransferingViewer方法的第二個參數destUserID表示當前的FileTransferingViewer控件要顯示與哪個好友相關的所有文件傳送項目的狀態。以QQ作類比,你同時在與多個好友傳送文件,那么就會有多個聊天窗口,每個聊天窗口都會有一個FileTransferingViewer實例,而這個FileTransferingViewer實例僅僅顯示與當前聊天窗口對應的好友的傳送項目。這樣依賴,你與aa01用戶傳送文件的進度查看器就不會在你與aa02的聊天窗口上顯示出來。

如果你的FileTransferingViewer查看器需要捕捉所有正在傳送的項目的實時狀態,那么,調用InitializeFileTransferingViewer方法時,destUserID參數可以傳入null。

另外,FileTransferingViewer實現了IFileTransferingViewer接口:

 

  1. public interface IFileTransferingViewer  
  2. {  
  3. /// <summary>  
  4. /// 當某個文件開始續傳時,觸發該事件。參數為FileName - isSend  
  5. /// </summary>  
  6. event CbGeneric<stringbool> FileResumedTransStarted;  
  7. /// <summary>  
  8. /// 當某個文件傳送完畢時,觸發該事件。參數為FileName - isSend  
  9. /// </summary>  
  10. event CbGeneric<stringbool> FileTransCompleted;  
  11. /// <summary>  
  12. /// 當某個文件傳送中斷時,觸發該事件。參數為FileName - isSend - FileTransDisrupttedType  
  13. /// </summary>  
  14. event CbGeneric<stringbool, FileTransDisrupttedType> FileTransDisruptted;  
  15. /// <summary>  
  16. /// 當某個文件傳送開始時,觸發該事件。參數為FileName - isSend  
  17. /// </summary>  
  18. event CbGeneric<stringbool> FileTransStarted;  
  19. /// <summary>  
  20. /// 當所有文件都傳送完成時,觸發該事件。  
  21. /// </summary>  
  22. event CbSimple AllTaskFinished;  
  23. /// <summary>  
  24. /// 當點擊取消按鈕終止某個文件傳送時,觸發該事件。  
  25. /// </summary>  
  26. event CbCancelFile CancelFileButtonClicked;   
  27. /// <summary>  
  28. /// 當前是否有文件正在傳送中。  
  29. /// </summary>   
  30. bool IsFileTransfering();  
  31. }  

你也可以通過該接口來關注FileTransferingViewer查看器捕捉到的(正如前所述,不一定是全部)文件傳送項目的狀態,而且,該接口的事件都是在UI線程中觸發的,你可以直接在其處理函數中操控UI顯示。

 

2.IFileBusinessHandler

客戶端的ESPlus.Application.FileTransfering.Passive.IFileBusinessHandler直接從IFileHandler繼承,而且沒有增加額外的內容:

 

  1. public interface IFileBusinessHandler : IBusinessHandler, IFileHandler  
  2. {   
  3. }  

 

四.服務端

服務端也可以接收客戶端發送的文件(即上傳),甚至可以發送文件給客戶端(即下載),它遵循同樣的文件傳送流程。

1.IFileTransferingController

如果需要服務端也參與到文件的發送與接收中來,則同客戶端一樣,服務端的ESPlus.Application.FileTransfering.Server.IFileTransferingController接口也從IFileController繼承,以提交文件發送請求、或取消正在發送中的文件等,這里就不重復解釋了。

2.IFileBusinessHandler

服務端需要實現ESPlus.Application.FileTransfering.Server.IFileBusinessHandler接口,也是直接從IFileHandler繼承,而且沒有增加額外的內容。

 

五.Rapid引擎對文件傳送的支持

新版本的Rapid引擎(可以從ESFramework 4.0 概述文末下載 ),增加了對文件傳送的支持,使用Rapid引擎的朋友可以很方便的利用框架提供的文件傳送功能。

1.客戶端

IRapidPassiveEngine的Initialize方法增加了一個重載:

  1. void Initialize(string userID, string serverIP, int serverPort, IBasicBusinessHandler basicHandler, ICustomizeInfoBusinessHandler customizeHandler ,IFileBusinessHandler fileHandler); 

該重載增加了一個IFileBusinessHandler參數,用于支持文件傳送機制。

另外,IRapidPassiveEngine增加了一個IFileOutter只讀屬性,通過暴露的該屬性,我們就可以提交發送文件的請求或監控文件傳送的狀態了。當然,如果在Initialize方法中沒有傳入有效的IFileBusinessHandler引用,則FileOutter屬性將返回null。

 

2.服務端

同客戶端一樣,服務端IRapidServerEngine的Initialize方法也增加了一個重載:

  1. void Initialize(int port, ICustomizeInfoBusinessHandler customizeInfoBusinessHandler,IFileBusinessHandler fileBusinessHandler, IFriendsManager friendsManager, IGroupManager groupManager);  

IRapidServerEngine提供了IFileTransferingController只讀屬性,用于提交發送文件的請求或監控文件傳送的狀態。同樣的,如果在Initialize方法中沒有傳入有效的IFileBusinessHandler引用,則FileTransferingController屬性將返回null。

 

Rapid引擎已經為我們組裝好了與文件傳送相關的所有組件,我們直接使用即可。如果后面有時間,我們會更深入地剖析ESPlus的文件傳送機制背后的原理,以及如何一步步地搭建起文件傳送的功能。

ESPlus使得在基于ESFramework的通信系統中增加文件傳送的功能變得如此簡單,甚至,基于ESPlus提供的文件傳送功能,我們可以很快地實現文件服務器,以支持文件上傳和下載。希望能給你帶來幫助。

【編輯推薦】

  1. 教你寫不可思議的C#代碼
  2. C#用Activex實現Web客戶端讀取RFID功能
  3. Visual Studio 2010調用非C#編寫的DLL文件
  4. More Effective C#:改善 C#程序的 50個具體辦法

 

責任編輯:于鐵 來源: 博客園
相關推薦

2021-12-08 10:36:46

JavaPDF文件

2021-12-09 09:02:53

JavaPDF文件iText

2021-01-07 09:56:43

Windows 功能系統

2020-02-20 16:07:45

IT需求

2020-12-28 07:47:35

動態代理AOP

2022-02-23 20:42:40

HTMLmarkdownturndown

2010-07-12 17:37:03

SQL Server

2011-08-29 09:26:57

Windows 8文件界面

2010-04-23 18:03:55

Aix 5.1

2010-06-28 14:49:51

SQL Server

2010-08-25 21:50:36

配置DHCP

2024-12-03 08:43:49

2022-08-12 12:19:13

Cluster檢索集群

2012-09-20 09:32:23

Ubuntu 12.1文件系統Ubuntu

2012-09-29 09:33:39

PowerPointOffice 2013

2010-01-15 12:50:02

CentOS 4文件

2012-09-20 09:24:41

Ubuntu 12.1文件系統

2011-10-11 10:53:29

Ubuntu 11.1Gnome 3.2

2013-04-23 14:25:28

gnupg文件加密

2009-04-29 01:39:57

破解美萍萬象
點贊
收藏

51CTO技術棧公眾號

国产日韩中文在线中文字幕| 第一页在线观看| 亚洲激情精品| 在线观看欧美www| 69久久精品无码一区二区| а√天堂8资源中文在线| 久久九九国产精品| 91偷拍精品一区二区三区| 国产免费观看av| 久久亚洲在线| 日韩av一区二区在线| 亚洲xxxx2d动漫1| 国产精品一区hongkong| 欧美激情一二三区| 国产尤物99| 国产一区二区视频免费观看| aa国产精品| 日韩一区二区久久久| 99久久久久久久久久| 国产高清日韩| 在线观看免费亚洲| aa在线观看视频| 成人日日夜夜| 欧美激情一区二区三区| 精品伦精品一区二区三区视频| 小泽玛利亚一区二区三区视频| 在线观看一区视频| 久久精品2019中文字幕| 最近中文字幕在线mv视频在线 | 高清视频一区| 一级黄在线观看| 日韩中文字幕区一区有砖一区| 欧美激情国产日韩精品一区18| 日本在线观看网址| 精品日韩免费| 日韩二区三区在线| 精品国产免费久久久久久婷婷| 日韩国产大片| 91激情五月电影| 97国产精东麻豆人妻电影| 免费在线观看av电影| 亚洲天堂精品在线观看| 香蕉久久免费影视| wwwww在线观看免费视频| 26uuu欧美| 精品蜜桃传媒| 三区在线观看| 久久综合九色综合久久久精品综合| 国产精品成人一区二区三区| 性欧美一区二区三区| 国精产品一区一区三区mba桃花| 国产精品人人做人人爽| 国产精品成人无码| 免费欧美在线视频| 国产欧美精品xxxx另类| 中文字幕在线播放不卡| 免费不卡在线观看| 成人av在线网址| 国产欧美综合视频| 国产一区二区女| 99久热re在线精品996热视频| av老司机久久| 成人免费黄色大片| 精品免费日产一区一区三区免费| 五月婷婷免费视频| 久久亚洲一级片| 日韩电影天堂视频一区二区| 成年人在线视频免费观看| 欧美—级在线免费片| 中文字幕黄色大片| 制服丝袜在线播放| 亚洲福利视频一区二区| 日韩少妇内射免费播放| 性欧美1819sex性高清| 欧美丝袜丝交足nylons图片| 手机在线国产视频| theporn国产在线精品| 亚洲国产精品视频在线观看| 精品无码国产污污污免费网站 | 国产亚洲一级高清| 国产精品一区二区亚洲| 欧美黄色一区二区| 97超碰蝌蚪网人人做人人爽| 无码人妻精品一区二区三区9厂| 麻豆精品久久精品色综合| 91高跟黑色丝袜呻吟在线观看| 国精产品一品二品国精品69xx | 国产精品一区二区x88av| 国产精品对白一区二区三区| 欧美偷拍视频| 中文字幕欧美一| 你真棒插曲来救救我在线观看| 在线免费av资源| 欧美高清www午色夜在线视频| 欧美在线a视频| 久久av导航| 欧美成人免费全部观看天天性色| 精品成人久久久| 精品影视av免费| 久久精品国产99精品国产亚洲性色| 狠狠色伊人亚洲综合网站l| 椎名由奈av一区二区三区| 日本欧美黄色片| 国产精品1区在线| 亚洲老司机av| 久久久久97国产| 日本免费在线视频不卡一不卡二| 高清不卡一区二区三区| 在线毛片网站| 日韩欧美成人网| 国产无套精品一区二区三区| 精品国产91乱码一区二区三区四区 | 自拍视频一区二区| 欧美va天堂在线| 国产精品私拍pans大尺度在线| 五月天婷婷在线播放| 一区二区三区在线不卡| 黄色手机在线视频| 久久99国内| 91福利视频网| 日本xxxx人| 亚洲精品福利视频网站| 日韩精品你懂的| 国产精品一区二区99| 国内自拍欧美激情| 亚洲第一天堂影院| 自拍视频在线观看一区二区| 一区二区三区免费播放| 久久不卡国产精品一区二区| 久久久女人电视剧免费播放下载| 国产精品久久无码一三区| 欧美激情中文字幕| 欧美精品一区二区三区免费播放| 免费福利视频一区| 国产+人+亚洲| 蜜桃91麻豆精品一二三区| 亚洲同性同志一二三专区| 欧美婷婷精品激情| 成人精品影院| 国产精品亚发布| av在线播放网站| 欧美午夜寂寞影院| 免费看日本黄色片| 全国精品久久少妇| 性欧美videosex高清少妇| 123成人网| 在线视频精品一| 中文字幕乱码视频| 国产精品美女久久久久高潮| 一区二区三区网址| 日韩欧美在线中字| 国产三级精品网站| 成人在线观看亚洲| 精品少妇一区二区三区视频免付费| 可以直接看的黄色网址| 国产成人免费视| 韩日视频在线观看| 欧洲亚洲视频| 欧洲亚洲妇女av| 国产有码在线| 欧美日韩亚洲综合一区二区三区| 最新日韩免费视频| 国模大尺度一区二区三区| 一区二区91美女张开腿让人桶| 中文字幕5566| 青青草成人影院| 成人精品一区二区三区| 最新国产在线拍揄自揄视频| 欧美电影免费提供在线观看| 五月天婷婷丁香| 久久亚洲春色中文字幕久久久| 日韩中文字幕免费在线| 午夜av一区| 国产一区二区中文字幕免费看| 成人影院大全| 色琪琪综合男人的天堂aⅴ视频| 国产毛片在线视频| 午夜私人影院久久久久| 熟女高潮一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 国产激情片在线观看| 日韩高清在线免费观看| 国产精品入口尤物| 日本在线视频www鲁啊鲁| 日韩av中文字幕在线免费观看| 波多野结衣电车痴汉| 亚洲免费成人av| 久久丫精品国产亚洲av不卡| 毛片基地黄久久久久久天堂| 亚洲精品天堂成人片av在线播放| 三级精品视频| 成人日韩在线电影| 天堂中文av在线资源库| 按摩亚洲人久久| 五月天激情婷婷| 欧美精品第1页| 一级免费在线观看| 亚洲色图丝袜美腿| 国产精品免费无码| 成人不卡免费av| 日韩欧美国产片| 欧美亚洲一区| 欧美日韩dvd| 日本成人小视频| 久久人人九九| av日韩精品| 国产在线拍偷自揄拍精品| 亚洲人体视频| 久久91精品国产| 最新国产在线观看| 亚洲老头同性xxxxx| 国产 日韩 欧美 综合| 欧美一区成人| 中文字幕一区二区三区在线播放| 久久久久狠狠高潮亚洲精品| 综合天堂久久久久久久| 日本在线观看一区| 久久综合五月婷婷| 亚洲在线免费看| 国产精成人品2018| 国产成人+综合亚洲+天堂| 欧美xxxx黑人又粗又长| 久久精品99久久久久久久久| 国产女人在线观看| 亚洲精品永久免费| 日韩一级片免费| 日韩手机在线导航| 国产精品国产三级国产普通话对白| 91福利区一区二区三区| 99热只有这里有精品| 午夜在线电影亚洲一区| 久久精品国产亚洲av高清色欲| 亚洲视频你懂的| 日本精品在线免费观看| 国产精品视频一二三区| av黄色在线免费观看| 国产婷婷一区二区| 少妇无套高潮一二三区| 国产欧美日韩在线| 五月天精品在线| 亚洲国产高清在线| 色欲狠狠躁天天躁无码中文字幕| 久久久久久久综合色一本| 一区二区三区少妇| 久久综合九色综合欧美98| 免费看污黄网站在线观看| 久久女同精品一区二区| 亚洲最大成人网站| 国产亚洲1区2区3区| 中文字幕欧美激情极品| 国产精品伦一区二区三级视频| jizz18女人高潮| 中文字幕在线播放不卡一区| 精品丰满少妇一区二区三区| 国产精品久久久久aaaa樱花 | 超碰成人久久| 亚洲电影免费| 99精品视频精品精品视频| 日韩视频在线免费播放| 午夜久久影院| 国精产品一区一区三区视频| 国产精品嫩草99av在线| 黄色一级二级三级| 精品一区二区三区视频在线观看| 免费精品99久久国产综合精品应用| 国产一区激情在线| 成年人小视频在线观看| 久久日韩粉嫩一区二区三区| www.黄色在线| 亚洲视频一区二区在线观看| 久久精品视频日本| 色综合久久99| 国产麻豆91视频| 亚洲精品av在线| 第一视频专区在线| 欧美大片欧美激情性色a∨久久| 欧美a级在线观看| 国产欧美日韩免费| 都市激情亚洲| 亚洲春色在线| 亚洲大胆av| www.夜夜爽| 成人自拍视频在线| 一级片久久久久| 亚洲在线成人精品| 欧美日韩一级黄色片| 欧美电影一区二区| 外国精品视频在线观看| 亚洲网站视频福利| 欧美午夜大胆人体| 国产精品精品视频一区二区三区| 国产一区二区三区免费在线| 精品在线不卡| 一区二区国产在线| 国产偷人视频免费| 国产成人精品一区二| 亚洲女优在线观看| 亚洲成人av免费| 国产精品一区二区免费视频 | 日本中文字幕在线观看| 91高清视频在线免费观看| 亚洲人体在线| 欧美尤物一区| 亚洲一级一区| 手机av在线网站| 国产精品视频在线看| 欧美日韩乱国产| 亚洲成人国产精品| caopeng在线| 国产日韩在线视频| 精品国产一区二区三区av片| 免费拍拍拍网站| 国产高清亚洲一区| 亚洲天堂精品一区| 日韩欧美在线观看| 韩国av免费在线| 欧美成人精品一区二区三区| 草民电影神马电影一区二区| 久久综合中文色婷婷| 激情成人综合| 国产ts在线观看| 亚洲精品菠萝久久久久久久| 亚洲天堂男人网| 中文字幕欧美视频在线| 免费日韩电影| 久久九九视频| 国产精品毛片一区二区三区| 亚洲性图第一页| 亚洲综合久久久久| 成人av无码一区二区三区| 久久中文精品视频| 91精品福利观看| 亚洲三区视频| 美女视频免费一区| 少妇视频在线播放| 欧美日韩一区二区在线观看视频| 成人在线免费看| 国产精品普通话| 欧美mv日韩| 天堂在线一区二区三区| 亚洲欧美色综合| 99热这里精品| 欧美大码xxxx| jizz国产精品| 免费国产a级片| 久久精品这里都是精品| 国产真人无遮挡作爱免费视频| 亚洲人成在线观| www.26天天久久天堂| 亚洲精品一区二区三区蜜桃久| 日本午夜精品视频在线观看| 婷婷丁香综合网| 欧美日韩国产欧美日美国产精品| 免费a在线看| 97人摸人人澡人人人超一碰| 欧美精品首页| 亚洲一级av无码毛片精品 | 国产麻豆免费观看| 欧美裸身视频免费观看| 黄色成人美女网站| 国产一区二区视频免费在线观看| 国产日韩欧美精品电影三级在线 | 色香欲www7777综合网| 视频二区一区| 国产自产高清不卡| 国产一级特黄a高潮片| 日韩精品欧美国产精品忘忧草| 亚洲成人短视频| 五月天色婷婷综合| 成人av在线播放网址| 国产精品suv一区| 久久精品国产2020观看福利| xxxx日韩| 人人爽人人av| 夜夜嗨av一区二区三区| 人人九九精品| 91人成网站www| 国产视频欧美| 91精品少妇一区二区三区蜜桃臀| 欧美r级在线观看| 电影一区电影二区| 麻豆一区二区三区在线观看| 91日韩精品一区| av网站免费播放| 青青久久aⅴ北条麻妃| 国产精品国产三级国产在线观看 | 亚洲在线成人精品| 岛国视频免费在线观看| 99国产超薄丝袜足j在线观看 | 中文字幕在线免费看线人| 欧美情侣在线播放| 欧美另类老肥妇| 欧美h视频在线观看| 97精品国产露脸对白| 91午夜交换视频| 人人澡人人澡人人看欧美| 欧美激情第10页| 日韩精品电影一区二区三区| 精品国产一区二区三区久久影院| 韩国成人在线|