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

淺析F#簡易Comet聊天服務(wù)實例

開發(fā) 后端
在這里我們將討論的是一個F#構(gòu)建簡易Comet聊天服務(wù)實例,希望對大家有所幫助。

Visual Studio 2010中關(guān)于F#的部分已經(jīng)眾人皆知,那么具體該怎么開發(fā)呢?這里作者將本來可以用C#開發(fā)的實例,改用F#來進(jìn)行,也是為大家開闊眼界。

#T#

普通的Web應(yīng)用程序,都是靠大量HTTP短連接維持的。如實現(xiàn)一個聊天服務(wù)時,客戶端會不斷輪詢服務(wù)器端索要新消息。這種做法的優(yōu)勢在于簡單有效,因此廣為目前的聊天服務(wù)所采用。不過Comet技術(shù)與之不同,簡單地說,Comet便是指服務(wù)器推(Server-Push)技術(shù)。它的實現(xiàn)方式是(這里只討論基于瀏覽器的Web平臺)在瀏覽器與服務(wù)器之間建立一個長連接,待獲得消息之后立即返回。否則持續(xù)等待,直至超時。客戶端得到消息或超時之后,又會立即建立另一個長連接。Comet技術(shù)的***優(yōu)勢,自然就是很高的即使性。

如果要在ASP.NET平臺上實現(xiàn)Comet技術(shù),那么自然需要在服務(wù)器端使用異步請求處理。如果是普通處理方式的話,每個請求都會占用一個工作線程,要知道Comet是“長連接”,因此不需要多少客戶端便會占用大量的線程,這對資源消耗是巨大的。如果是異步請求的話,雖然客戶端和服務(wù)器端之間一直保持著連接,但是客戶端在等待消息的時候是不占用線程的,直到“超時”或“消息到達(dá)”時才繼續(xù)執(zhí)行。

以前也有人實現(xiàn)過基于ASP.NET的Comet服務(wù)原型,不過是使用C#的。而現(xiàn)在我們用F#來實現(xiàn)這個功能。您會發(fā)現(xiàn)F#對于此類異步場景有其獨特的優(yōu)勢。

F#常用的工作單元是“模塊”,其中定義了大量函數(shù)或字段。例如我們要打造一個聊天服務(wù)的話,我便定義了一個Chat模塊:

  1. #light  
  2. module internal Comet.Chating.Chat  
  3. open System  
  4. open System.Collections.Concurrent  
  5.  
  6. type ChatMsg = {  
  7.     From: string;  
  8.     Text: string;  
  9. }  
  10.  
  11. let private agentCache = new ConcurrentDictionary>()  
  12.  
  13. let private agentFactory = new Func>(fun _ ->   
  14.     MailboxProcessor.Start(fun o -> async { o |> ignore }))  
  15.  
  16. let private GetAgent name = agentCache.GetOrAdd(name, agentFactory) 

在這里我構(gòu)建了一個名為ChatMsg的Record類型,一個ChatMsg對象便是一條消息。然后,我使用一個名為agentCache的ConcurrentDictionary對象來保存每個用戶所對應(yīng)的聊天隊列——MailboxProcessor。它是F#核心庫中內(nèi)置的,用于實現(xiàn)消息傳遞式并發(fā)的組件,非常輕量級,因此我為每個用戶分配一個也只使用很少的資源。GetAgent函數(shù)的作用是根據(jù)用戶的名稱獲取對應(yīng)的MailboxProcessor對象,自不必多說。

Chat模塊中還定義了send和receive兩個公開方法,如下:

  1. let send fromName toName msg =   
  2.     let agent = GetAgent toName  
  3.     { From = fromName; Text = msg; } |> agent.Post  
  4.  
  5. let receive name =   
  6.     let rec receive' (agent: MailboxProcessor) messages =   
  7.         async {  
  8.             let! msg = agent.TryReceive 0  
  9.             match msg with  
  10.             | None -> return messages  
  11.             | Some s -> return! receive' agent (s :: messages)  
  12.         }  
  13.  
  14.     let agent = GetAgent name  
  15.  
  16.     async {  
  17.         let! messages = receive' agent List.empty  
  18.         if (not messages.IsEmpty) then return messages  
  19.         else 
  20.             let! msg = agent.TryReceive 3000  
  21.             match msg with  
  22.             | None -> return []  
  23.             | Some s -> return [s]  
  24.     } 

send方法接受3個參數(shù),沒有返回值,它的實現(xiàn)只是簡單地構(gòu)造一個ChatMsg對象,并塞入對應(yīng)的MailboxProcessor。不過receive方法是這里最關(guān)鍵的部分(沒有之一)。receive函數(shù)的作用是接受并返回MailboxProcessor中已有的對象,或者等待3秒鐘后超時——這么說其實不太妥當(dāng),因為receive方法其實只是構(gòu)造了一個“做這件事情”的Async Workflow,而還沒有真正執(zhí)行它。至于它是如何執(zhí)行的,我們稍候再談。

receive函數(shù)的邏輯是這樣的:首先我們構(gòu)造一個輔助函數(shù)receive’來“嘗試獲取”隊列中已有的所有消息。receive’是一個遞歸函數(shù),每次獲取一個,并遞歸獲取剩余的消息。agent.TryReceive函數(shù)接受0,表示查詢隊列,并立即返回一個Option結(jié)果,如果這個結(jié)果為None,則表示隊列已為空。于是在receive這個主函數(shù)中,便先使用receive’函數(shù)獲取已有消息,如果存在則立即返回,否則便接收3秒鐘內(nèi)獲得的***個消息,如果3秒結(jié)束還沒有收到則返回None。

在receive和receive’函數(shù)中都使用了let!獲取agent.TryReceive函數(shù)的結(jié)果。let!是F#中構(gòu)造Workflow的關(guān)鍵字,它起到了“語法糖”的作用。例如,以下的Async Workflow:

  1. async {  
  2.     let req = WebRequest.Create("http://moma.org/")  
  3.     let! resp = req.GetResponseAsync()  
  4.     let stream = resp.GetResponseStream()  
  5.     let reader = new StreamReader(stream)  
  6.     let! html = reader.ReadToEndAsync()  
  7.     html  

事實上在“解糖”后就變成了:

  1. async.Delay(fun () ->  
  2.     async.Let(WebRequest.Create("http://moma.org/"), (fun req ->  
  3.         async.Bind(req.GetResponseAsync(), (fun resp ->  
  4.             async.Let(resp.GetResponseStream(), (fun stream ->  
  5.                 async.Let(new StreamReader(stream), (fun reader ->  
  6.                     async.Bind(reader.ReadToEndAsync(), (fun html ->  
  7.                         async.Return(html)))))))))) 

let!關(guān)鍵字則會轉(zhuǎn)化為Bind函數(shù)調(diào)用,Bind調(diào)用有兩個參數(shù),***個參數(shù)為Async<’a>類型,它便負(fù)責(zé)一個“回調(diào)”,待回調(diào)后才執(zhí)行一個匿名函數(shù)——也就是Bind函數(shù)的第二個參數(shù)。可見,let!關(guān)鍵字的一個重要作用,便是將流程的“控制權(quán)”轉(zhuǎn)交給“系統(tǒng)”,待合適的時候再繼續(xù)執(zhí)行下去。這便是關(guān)鍵,因為這樣的話,在接受一個消息的時候,這等待的3秒鐘是不占用任何線程的,也就是真正的純異步。但是如果觀察代碼——難道不是純粹的順序型寫法嗎?

這就是F#的神奇之處。

在ASP.NET處理時需要Handler,于是在Send階段便是簡單的IHttpHandler:

  1. #light  
  2.  
  3. namespace Comet.Chating  
  4.  
  5. open Comet  
  6. open System  
  7. open System.Web  
  8.  
  9. type SendHandler() =  
  10.  
  11.     interface IHttpHandler with  
  12.         member h.IsReusable = false 
  13.         member h.ProcessRequest(context) =   
  14.             let fromName = context.Request.Form.Item("from");  
  15.             let toName = context.Request.Form.Item("to")  
  16.             let msg = context.Request.Form.Item("msg")  
  17.             Chat.send fromName toName msg  
  18.             context.Response.Write "sent" 

而Receive階段則是個異步的IHttpAsyncHandler:

  1. #light  
  2.  
  3. namespace Comet.Chating  
  4.  
  5. open Comet  
  6. open System  
  7. open System.Collections.Generic  
  8. open System.Web  
  9. open System.Web.Script.Serialization  
  10.  
  11. type ReceiveHandler() =  
  12.  
  13.     let mutable m_context = null 
  14.     let mutable m_endReceive = null 
  15.  
  16.     interface IHttpAsyncHandler with  
  17.         member h.IsReusable = false 
  18.         member h.ProcessRequest(context) = failwith "not supported" 
  19.  
  20.         member h.BeginProcessRequest(c, cb, state) =  
  21.             m_context <- c  
  22.  
  23.             let name = c.Request.QueryString.Item("name")  
  24.             let receive = Chat.receive name  
  25.             let beginReceive, e, _ = Async.AsBeginEnd receive  
  26.             m_endReceive <- new Func<_, _>(e)  
  27.  
  28.             beginWork (cb, state)  
  29.  
  30.         member h.EndProcessRequest(ar) =  
  31.             let convert (m: Chat.ChatMsg) =  
  32.                 let o = new Dictionary<_, _>();  
  33.                 o.Add("from", m.From)  
  34.                 o.Add("text", m.Text)  
  35.                 o  
  36.  
  37.             let result = m_endReceive.Invoke ar  
  38.             let serializer = new JavaScriptSerializer()  
  39.             result  
  40.             |> List.map convert  
  41.             |> serializer.Serialize  
  42.             |> m_context.Response.Write 

這里的關(guān)鍵是Async.AsBeginEnd函數(shù),它將Chat.receive函數(shù)生成的Async Workflow轉(zhuǎn)化成一組標(biāo)準(zhǔn)APM形式的begin/end對,然后我們只要把BeginProcessRequest和EndProcessReqeust的職責(zé)直接交給即可。剩下的,便是一些序列化成JSON的工作了。

于是我們可以新建一個Web項目,引用F#工程,在Web.config里配置兩個Handler,再準(zhǔn)備一個Chat.aspx頁面即可。您可以在文末的鏈接中查看該頁面的代碼,也可以在這里試用其效果。作為演示頁面,您其實只能“自己給自己”發(fā)送消息,其主要目的是查看其響應(yīng)時間而已。例如,以下便是使用效果一例:

  1. 2 - receiving...  
  2. 3026 - received nothing (3024ms)  
  3. 3026 - receiving...  
  4. 6055 - received nothing (3028ms)  
  5. 6055 - receiving...  
  6. 7256 - sending 123654...  
  7. 7268 - received: 123654 (1213ms)  
  8. 7268 - receiving...  
  9. 10281 - received nothing (3013ms)  
  10. 10281 - receiving...  
  11. 13298 - received nothing (3017ms)  
  12. 13298 - receiving...  
  13. 13679 - sending 123456...  
  14. 13698 - received: 123456 (400ms)  
  15. 13698 - receiving...  
  16. 16716 - received nothing (3018ms)  
  17. 16716 - receiving...  
  18. 18256 - sending hello world...  
  19. 18265 - received: hello world (1549ms)  
  20. 18266 - receiving...  
  21. 21281 - received nothing (3015ms)  
  22. 21281 - receiving... 

可見,如果沒有收到消息,那么receive操作會在3秒鐘后返回。當(dāng)send一條消息后,先前的receive操作便會立即獲得消息了,即無需等待3秒便可提前返回。這便是Comet的效果。

至于性能,我寫了一個客戶端小程序,用于模擬大量用戶同時聊天,每個用戶每隔1秒便給另外5個用戶發(fā)送一條消息,然后查看這條消息收到時產(chǎn)生多少的延遲。經(jīng)過本機測試(2.4GHz雙核,2G內(nèi)存),當(dāng)超過2K個在線用戶時(即2000個長連接)延遲便超過了1秒——到20K還差不多。這個性能其實并不理想。不過,我這個測試也很一般。因為測試環(huán)境相當(dāng)馬虎,大量程序(如N個VS)基本上已經(jīng)完全用滿了所有的物理內(nèi)存,測試客戶端和服務(wù)器也是同一臺機器,甚至代碼也是Debug編譯的……而根據(jù)監(jiān)視,測試用的客戶端小程序CPU占用超過50%,而服務(wù)器進(jìn)程對應(yīng)的w3wp.exe的CPU占用卻小于10%。因此,我們可以這樣推斷,其實服務(wù)器端的性能并沒有用足,也有可能是MailboxProcessor的調(diào)度方式不甚理想。至于具體是什么原因,我還在調(diào)查之中。

***我想說的是,這個Comet實現(xiàn)只是一個原型,我最想說明的問題其實是F#在異步編程中的優(yōu)勢。目前我寫的一些程序,例如一些網(wǎng)絡(luò)爬蟲,都已經(jīng)使用F#進(jìn)行開發(fā)了,因為它的Async Workflow實在是過于好用,為我省了太多力氣。同時我還想證明,“語言特性”并非不重要,它對于編程的簡化也是至關(guān)重要的。在我看來,“類庫”也好,“框架”也罷都是可以補充的,但是語言特性是個無法突破的“限制”。例如,異步編程對于F#來說簡化了不少,這是因為我們可以使用順序的方式編寫異步程序。在C#中略有不足,但還有yield可以起到相當(dāng)作用,因此我們可以使用CCR和AsyncEnumerator簡化異步操作。但如果您使用的是Java這種劣質(zhì)語言……因此,放棄Java,使用Scala吧。

值得一提的是,Async Workflow并不是F#的語言特性,F(xiàn)#的語言特性是Workflow,而Async Workflow其實只是實現(xiàn)了一個Workflow Builder,也就是那個async { ... },以此來簡化異步編程而已。PDC 09上關(guān)于F#對異步編程的支持也有相應(yīng)的介紹。

原文標(biāo)題:數(shù)十行F#打造簡易Comet聊天服務(wù)

鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/12/11/fsharp-comet-prototype.html

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-08-14 17:04:19

Windows后臺服務(wù)

2010-01-26 08:25:06

F#語法F#教程

2010-01-07 10:04:18

F#函數(shù)式編程

2009-08-18 18:01:20

F#函數(shù)式語言

2010-01-15 08:33:13

F#F#類型推斷F#教程

2010-04-07 16:51:59

F#

2021-08-06 06:51:14

NacosRibbon服務(wù)

2009-08-13 17:39:48

F#數(shù)據(jù)類型Discriminat

2011-06-09 09:52:41

F#

2009-08-19 09:42:34

F#并行排序算法

2009-10-09 17:18:13

RHEL配置NIS

2009-09-10 14:18:59

Functional F#

2010-03-26 19:22:08

F#代理

2012-11-06 10:01:35

ContinuatioF#

2009-12-14 09:04:10

F#運算符

2009-12-04 09:16:44

Visual Stud

2009-11-16 09:05:46

CodeTimer

2009-08-13 17:25:21

F#入門

2023-02-10 08:16:48

WebSocket簡易聊天室

2009-08-14 14:17:16

C#Windows服務(wù)
點贊
收藏

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

www国产无套内射com| 97国产在线视频| 最新av免费在线观看| 国产成人午夜| 99精品一区二区| 国产精品视频在线观看| 青青草成人免费| 日本国产精品| 欧美精品久久久久久久多人混战| 久久手机在线视频| 国产一区二区影视| 国产98色在线|日韩| 欧美诱惑福利视频| 亚洲最大的黄色网址| 日韩大片在线免费观看| 欧美日韩国产高清一区| 国产主播在线看| a级在线观看| 久久久久久久久久久久久女国产乱| 91精品免费视频| 五月婷婷激情视频| 国产精品hd| 色噜噜狠狠狠综合曰曰曰| 黄色网址在线视频| 国产亚洲精aa在线看| 欧美性猛交xxxx黑人猛交| 日本黄色片一级片| 欧美女子与性| 不卡一区二区中文字幕| 91亚洲精品一区二区| 日本久久综合网| 亚洲伦伦在线| 欧美成人激情在线| 日本成人免费在线观看| 国产一区二区三区不卡视频网站| 精品久久久久久久人人人人传媒 | 欧美色欧美亚洲高清在线视频| 一区不卡视频| 国产对白叫床清晰在线播放| 91美女在线视频| 国产精品一区二区欧美| va视频在线观看| 狠狠色综合播放一区二区| 国产精品国产自产拍高清av水多 | 免费福利视频网站| 色狼人综合干| 精品亚洲永久免费精品| 成人性生活免费看| 黑人久久a级毛片免费观看| 91精品国产色综合久久ai换脸| 亚洲国产日韩欧美在线观看| 成人自拍av| 色妹子一区二区| 国产性xxxx18免费观看视频| 免费高潮视频95在线观看网站| 亚洲成a人v欧美综合天堂下载 | 性xxxfreexxxx性欧美| 中文字幕亚洲一区二区va在线| 亚洲成人av动漫| 尤物视频在线免费观看| 中文字幕一区二区三区精华液| 一区二区不卡在线视频 午夜欧美不卡'| 国产乱子伦三级在线播放| 久久精品亚洲乱码伦伦中文 | 日韩欧美高清视频| 男女av免费观看| 成人va天堂| 欧美性色黄大片| 国产精品久久久毛片| 久久不卡日韩美女| 欧美一区日韩一区| 美女网站视频在线观看| 羞羞答答一区二区| 国产小视频国产精品| 在线观看免费小视频| 久久电影院7| 欧美另类在线观看| 日韩无码精品一区二区三区| 亚洲免费网址| 国产精品视频最多的网站| 国产伦理吴梦梦伦理| 国产精品一区二区果冻传媒| 精品视频在线观看| a√资源在线| 亚洲精品乱码久久久久久| 国产精品国产亚洲精品看不卡| 偷拍中文亚洲欧美动漫| 欧美日韩在线直播| 日本xxxx免费| 国产99亚洲| 久久精品人人做人人爽| 国产午夜久久久| 日本不卡123| av一本久道久久波多野结衣| 神马久久久久| 亚洲日本电影在线| 精品中文字幕av| 91麻豆精品| 精品无人国产偷自产在线| 看黄色录像一级片| 亚洲免费黄色| 91免费视频国产| 男男电影完整版在线观看| 亚洲欧美日韩国产手机在线| 国产日韩一区二区在线观看| 先锋影音一区二区| 精品视频久久久久久久| 肉色超薄丝袜脚交69xx图片| 亚洲免费影院| 国产精品一区二区欧美黑人喷潮水 | 欧美日韩国产免费一区二区三区| 国产精品实拍| 在线一区二区三区| 男人网站在线观看| 99精品全国免费观看视频软件| 91成人免费观看网站| 国产日韩精品suv| 久久精品在线免费观看| 人妻av中文系列| 精品中文字幕一区二区三区| 在线性视频日韩欧美| 日韩毛片在线视频| 国产成人精品影视| 女女同性女同一区二区三区按摩| 日韩成人av电影| 日韩精品高清在线| 国产午夜激情视频| 国产精品99精品久久免费| 亚洲免费久久| 午夜日韩成人影院| 亚洲精品在线视频| 国产第一页在线播放| 国产精品一级在线| 美女在线免费视频| 日本免费在线一区| 中文字幕视频在线免费欧美日韩综合在线看 | 色哟哟一区二区在线观看| 亚洲香蕉中文网| 欧美日韩亚洲一区在线观看| 国产这里只有精品| 香蕉视频免费在线播放| 欧美性大战久久久久久久蜜臀| 国产精品无码一区二区三区免费| 亚洲区国产区| 国产一区二区三区高清| 国产深夜视频在线观看| 日韩免费在线观看| 久草视频免费在线| 国产精品99久久不卡二区| 久久久99精品视频| 天堂久久av| 久久久噜噜噜久噜久久| 日韩中文字幕影院| 亚洲成人自拍偷拍| 一级特黄a大片免费| 亚洲少妇一区| 欧美日韩中文国产一区发布| 日韩成人亚洲| 色综合伊人色综合网| 97精品人妻一区二区三区香蕉| 亚洲欧洲另类国产综合| 亚洲怡红院在线| 在线观看免费一区二区| 超碰97人人人人人蜜桃| brazzers在线观看| 日韩精品福利网站| 国产在线一级片| 亚洲欧美偷拍三级| 精品国产乱码久久久久夜深人妻| 亚洲毛片av| 日本免费高清一区二区| 视频91a欧美| 欧美理论电影在线观看| 日韩av资源站| 欧美日韩不卡在线| 免费一级片在线观看| 99视频有精品| 99热手机在线| 欧美午夜电影在线观看| 久久国产精品久久精品国产| 超碰这里只有精品| 欧美成人精品在线观看| 亚洲av成人精品毛片| 欧美性色黄大片| 五月婷婷一区二区| 91免费看`日韩一区二区| 爱情岛论坛成人| 亚洲无线视频| 日韩亚洲不卡在线| 一本一道久久a久久| 日本久久91av| 在线xxxx| 亚洲天堂av网| 黄色av网址在线| 91极品美女在线| 免费无码毛片一区二区app| 久久久激情视频| 四虎成人在线播放| 亚洲欧美日韩综合国产aⅴ| 在线观看亚洲视频啊啊啊啊| 久久狠狠久久| 成人中文字幕+乱码+中文字幕| 18video性欧美19sex高清| 日韩一中文字幕| 性xxxx视频播放免费| 91精品欧美综合在线观看最新| 中文字幕一区二区三区手机版 | 日本一区二区电影| 欧美激情精品在线| 毛片av在线| 亚洲欧美资源在线| 狠狠躁夜夜躁av无码中文幕| 69堂成人精品免费视频| 国产污视频网站| 亚洲成人资源在线| 国产一区二区播放| 国产精品你懂的在线欣赏| 屁屁影院国产第一页| 国产丶欧美丶日本不卡视频| 国产精品一久久香蕉国产线看观看| 性chinese极品按摩| 国内一区二区三区| 中文字幕一区二区三区四区五区| 羞羞答答一区二区| 国产精品中出一区二区三区| 四虎地址8848精品| 国产va免费精品高清在线观看| 免费在线观看的电影网站| www.精品av.com| 成人资源www网在线最新版| 日韩精品视频在线免费观看| 亚洲高清视频网站| 3atv在线一区二区三区| 中文字幕第315页| 色综合久久中文综合久久牛| 亚洲视频免费播放| 亚洲成人777| 久久综合综合久久| 一区二区三区不卡在线观看| 欧美色图亚洲视频| 亚洲欧洲韩国日本视频| 五月天精品在线| 中文欧美字幕免费| 国产三级短视频| 欧美国产欧美亚州国产日韩mv天天看完整| 毛茸茸多毛bbb毛多视频| av电影在线观看一区| 人妻 日韩 欧美 综合 制服| 成人午夜看片网址| 欧美做受高潮中文字幕 | youjizz.com日本| 国产精品资源站在线| 成人性生交视频免费观看| 激情欧美一区二区三区在线观看| 一起操在线视频| 另类调教123区 | 亚洲人成无码网站久久99热国产| 国产视频一区二区| 日韩中文有码在线视频| 日本激情在线观看| 久久精品视频免费播放| 成人在线app| 欧美国产日韩一区二区| av影视在线看| 欧美亚洲视频在线观看| 韩国美女久久| 国产精品直播网红| 国产精选久久| 国产美女精品在线观看| 婷婷成人影院| 五月天亚洲综合小说网| 91精品秘密在线观看| 国产在线视频在线| 亚洲精品乱码| 日日碰狠狠丁香久燥| 九九精品视频在线看| 毛片毛片毛片毛片毛| proumb性欧美在线观看| 99久久久无码国产精品衣服| 亚洲色图欧美激情| 日本少妇毛茸茸高潮| 一本高清dvd不卡在线观看| 中文字幕一区二区三区人妻四季 | 日本成人小视频| 在线视频不卡一区二区| 在线精品亚洲| 亚洲三级视频网站| 国产成人在线色| 亚洲a v网站| 一区二区国产盗摄色噜噜| 特黄视频免费看| 欧美日韩国产bt| 色综合免费视频| 色多多国产成人永久免费网站| 成人高潮aa毛片免费| 国产精品久久久久久av下载红粉| 国产一区二区三区黄网站| 精品中文字幕人| 91精品国产91久久久久久黑人| 国产精品一区二区免费在线观看| 美腿丝袜亚洲色图| 91丨porny丨对白| 最新国产成人在线观看| av资源免费观看| 337p亚洲精品色噜噜| 亚洲色欧美另类| 欧美另类第一页| 国产乱子精品一区二区在线观看| 久久综合久久综合亚洲| 性色av蜜臀av浪潮av老女人| 中文字幕二三区不卡| 91久久国产视频| 欧美一级搡bbbb搡bbbb| 国产成人天天5g影院在线观看| 欧美激情欧美激情在线五月| 成人福利片在线| 欧美国产二区| 在线观看日韩av电影| 亚洲av无一区二区三区久久| 国产欧美综合色| 久久国产视频精品| 亚洲成年人在线播放| 黄色网页在线免费观看| 国产精品电影在线观看| 啪啪国产精品| 日韩网站在线免费观看| 国产福利电影一区二区三区| 999精品在线视频| 欧美最猛黑人xxxxx猛交| 三级视频网站在线| 久久人人爽人人| av日韩在线播放| 少妇一晚三次一区二区三区| 韩国午夜理伦三级不卡影院| 日韩不卡av在线| 欧美私人免费视频| 国产一级片在线| 国产成人激情小视频| 九热爱视频精品视频| avav在线看| 久久久久久一级片| 丰满少妇xoxoxo视频| 精品偷拍各种wc美女嘘嘘| 美女av在线免费看| 精品九九九九| 亚洲精品乱码| 欧美一区二区三区成人精品| 欧美日韩裸体免费视频| 深夜影院在线观看| 97超碰蝌蚪网人人做人人爽| 日韩av三区| 欧美污视频网站| 国产日韩欧美电影| 中文字幕第三页| 久久久精品2019中文字幕神马| 香蕉久久久久久| www.99riav| 99久久国产综合色|国产精品| 久久艹免费视频| 亚洲日本成人网| 成人在线高清| 欧美少妇一区二区三区| 国产91精品久久久久久久网曝门| 日本少妇做爰全过程毛片| 日韩精品在线第一页| 日韩制服一区| 97精品国产97久久久久久粉红| 国产999精品久久| 日本中文字幕在线| 永久免费精品影视网站| 国产电影一区二区| 国产成a人亚洲精v品在线观看| www.日韩精品| 中文字幕乱码人妻二区三区| 久久这里只有精品视频首页| 国产精品白浆| 欧洲熟妇精品视频| 亚洲人成精品久久久久久| 日本xxxxxwwwww| 国产精品爱啪在线线免费观看| 欧美激情国产在线| 人妻av一区二区| 欧美在线观看一区二区| av毛片在线播放| 免费一区二区三区| 精品影院一区二区久久久| 日韩成人在线免费视频| 永久免费毛片在线播放不卡 | 久久一区亚洲| 日韩av手机在线免费观看| 亚洲国产成人精品女人久久久 | 白丝女仆被免费网站| 欧美日韩不卡一区二区| 超碰97国产精品人人cao| 日韩久久久久久久| 国产a区久久久| 中文在线资源天堂| 性欧美xxxx| 一区二区三区四区电影| 日韩精品无码一区二区三区久久久 |