精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

久久久久久久久免费| 国产精品久久久视频| 国产真实乱偷精品视频| 亚洲插插视频| 国产麻豆精品在线| 亚洲无线码在线一区观看| 国产日韩综合一区二区性色av| 色婷婷一区二区三区在线观看| 色婷婷视频在线| 91精品久久久久久久蜜月| 色综合中文字幕| 国产亚洲福利社区| 91成人福利视频| av成人亚洲| 久久亚洲春色中文字幕久久久| 欧美激情2020午夜免费观看| www.亚洲自拍| 末成年女av片一区二区下载| 成人午夜看片网址| 欧美大片在线看免费观看| 久久国产精品影院| 鲁鲁在线中文| 国产精品乱人伦中文| 国产999精品| 精品人妻一区二区三区香蕉| av免费在线视| 欧美激情1区2区| 欧美日韩一二三区| 三级三级久久三级久久18| 亚洲精品男人的天堂| 任我爽精品视频在线播放| 亚洲成人免费视频| 国产在线精品二区| 91成人一区二区三区| 日本一区二区三区视频| 欧美图区在线视频| 亚洲一区高清| 99re只有精品| 欧美日韩三级| 日韩av中文字幕在线播放| 国产91xxx| 国产a级免费视频| 欧美日韩午夜| 日韩中文字幕网址| www.com久久久| 3d玉蒲团在线观看| av综合在线播放| 欧美专区日韩视频| 国产欧美小视频| 国产在线不卡一区二区三区| 亚洲五码中文字幕| 精品一区久久久久久| 精品无码一区二区三区的天堂| 成人一区而且| 337p亚洲精品色噜噜狠狠| 国产精品啪啪啪视频| 少妇人妻一区二区| 大胆亚洲人体视频| 高清视频在线观看一区| 手机看片久久久| 日韩伦理一区| 国产午夜精品一区二区三区| xxx在线播放| 国产成人免费av一区二区午夜| 欧美自拍偷拍午夜视频| 永久免费在线看片视频| 殴美一级特黄aaaaaa| 手机精品视频在线观看| 美日韩精品免费观看视频| av网页在线观看| 久久69成人| 亚洲午夜久久久久久久久电影网| 国产资源第一页| 青春草视频在线| 久久久99精品免费观看不卡| 欧美日本国产精品| 精品人妻少妇嫩草av无码专区| 香蕉亚洲视频| 欧美大奶子在线| 欧美激情图片小说| 激情婷婷综合| 亚洲国产精品小视频| 日韩不卡一二三| 国产在线看片免费视频在线观看| 国产精品高潮久久久久无| 国产精品久久久久久久久久久久午夜片 | 欧美性猛交一区二区三区精品| 超碰超碰在线观看| 久久影院一区二区三区| 一本一本大道香蕉久在线精品| 99视频免费播放| 91jq激情在线观看| 福利视频第一区| 国产一区二区三区在线免费| 在线免费看av| 久久综合久色欧美综合狠狠| 亚洲丰满在线| 日韩电影在线观看完整版| 国产乱妇无码大片在线观看| 国产精品乱码一区二区三区| 五月婷婷六月丁香| 国产麻豆精品视频| 你懂的视频在线一区二区| 欧美一级特黄aaaaaa| 久久久精品日韩欧美| 国产成人三级视频| 厕沟全景美女厕沟精品| 午夜精品久久久久久久久久久 | 青梅竹马是消防员在线| 国产精品女同互慰在线看| 日本免费成人网| 日韩欧美少妇| 色爱区综合激月婷婷| 97视频久久久| 欧美高清另类hdvideosexjaⅴ| 婷婷夜色潮精品综合在线| 9色porny| 丁香花在线影院| 亚洲不卡一区二区三区| 嫩草影院国产精品| 国产成人精选| 亚洲国产第一页| 亚洲色偷偷色噜噜狠狠99网| jazzjazz国产精品麻豆| 亚洲白拍色综合图区| 日批视频在线看| 欧美影院视频| 日韩精品一区二区三区老鸭窝| 风韵丰满熟妇啪啪区老熟熟女| 天堂va欧美ⅴa亚洲va一国产| 亚洲欧美日本另类| 国产精品密蕾丝袜| 欧美丝袜激情| 午夜精品福利在线观看| 国内免费精品视频| 午夜在线一区| 国产乱码精品一区二区三区日韩精品| 三区四区在线视频| 亚洲精品免费看| 男女啪啪免费视频网站| 日本一区二区三区视频在线看 | b站大片免费直播| 国产精品99一区二区| 91九色国产社区在线观看| 99热这里只有精品在线观看| 中文字幕不卡在线| 国产又爽又黄ai换脸| 日本天码aⅴ片在线电影网站| 亚洲成人免费在线| www.欧美com| 中文字幕一区二区三区久久网站| 97免费在线视频| 国产成人手机在线| 久久久久久9999| 男人天堂999| avtt久久| 日韩精品在线视频美女| 女人裸体性做爰全过| 日韩国产精品久久久| 92福利视频午夜1000合集在线观看| 成人午夜免费在线观看| 亚洲女人****多毛耸耸8| 日韩小视频在线播放| 电影一区二区在线观看| 夜夜嗨av一区二区三区四区 | 亚洲AV无码精品色毛片浪潮| 99国产精品国产精品毛片| 午夜精品短视频| av在线日韩| 视频直播国产精品| 国产91av视频| 精品一区二区三区在线观看| 国产专区一区二区三区| 色戒汤唯在线观看| 亚洲丝袜一区在线| 国产一级一片免费播放放a| 成人国产电影网| 中文字幕av日韩精品| 漫画在线观看av| 亚洲色图综合网| 中文字幕av网站| 91视视频在线观看入口直接观看www | 亚欧洲精品视频在线观看| 色系列之999| 国产日韩免费视频| 亚洲午夜免费福利视频| 乐播av一区二区三区| 韩国精品久久久| 日韩福利影院| 一级毛片久久久| 在线视频中文亚洲| 人人爽人人爽人人片av| 国产精品网站在线| 天堂va欧美va亚洲va老司机| 午夜在线精品| 亚洲黄色网址在线观看| 欧美一区二区三区红桃小说| 国产精品一区二区女厕厕| 美州a亚洲一视本频v色道| 亚洲午夜在线视频| 精品无人区无码乱码毛片国产| 久久99久久99精品免视看婷婷| bt天堂新版中文在线地址| 精品色999| 国产成人精品av在线| 日本韩国精品一区二区| 6080日韩午夜伦伦午夜伦| 亚洲黄色激情视频| 亚洲精品日产精品乱码不卡| 中文字幕一区二区三区人妻不卡| 九九久久精品视频| 成年人网站免费视频| 亚洲成av人片一区二区密柚| 欧美色欧美亚洲另类七区| 奇米一区二区| 成人激情视频在线| 日韩成人影视| 日韩精品免费在线视频| 国产三级三级在线观看| 日本韩国欧美一区| 日韩 欧美 综合| 成人动漫一区二区三区| 国产精品一区二区羞羞答答| 国产精品最新| 国产精品一区二区三区观看| 日韩久久一区| 九色成人免费视频| 特黄aaaaaaaaa真人毛片| 欧美日产国产精品| 日本中文字幕免费在线观看| 国产日产欧产精品推荐色| 国产又大又黄又粗的视频| 亚洲国产99| 欧美一级日本a级v片| 香蕉成人影院| 美女久久久久久久久久久| 91se在线| 国产亚洲一区二区在线| 精品三级久久久久久久电影聊斋| 欧美日韩在线亚洲一区蜜芽| 色屁屁影院www国产高清麻豆| 亚洲成人av一区二区| 欧美成人三级在线观看| 亚洲欧美日韩精品久久久久| 久久久久久久久久影视| 美女精品一区| 熟妇熟女乱妇乱女网站| 欧美日韩有码| 亚洲.欧美.日本.国产综合在线| 蜜桃国内精品久久久久软件9| 国产情人节一区| 国产亚洲欧美日韩精品一区二区三区| 国产999精品久久久影片官网| sis001欧美| 欧洲精品在线视频| 亚洲承认视频| 欧美美女18p| 国产1区在线| 精品中文字幕久久久久久| 深爱激情五月婷婷| 亚洲黄色在线看| 日本午夜在线| 这里只有精品视频| 国产激情在线观看| 欧美激情第6页| www视频在线观看| 91豆花精品一区| 国产激情视频在线观看| 久久久精品影院| 黄色在线播放| 在线成人一区二区| 美女国产在线| 亚洲天堂影视av| 91caoporm在线视频| 久久精品国产96久久久香蕉| 午夜伦理在线视频| 97人人做人人爱| 91国内外精品自在线播放| 国产日本欧美一区二区三区| 日本精品视频| 久久99国产精品99久久| 日韩精品视频在线看| 国产精品久久亚洲7777| 美女毛片一区二区三区四区| 亚洲午夜高清视频| 影音先锋中文字幕一区| 一区精品在线| 欧美在线三级| 日韩人妻精品无码一区二区三区| 青娱乐精品在线视频| 香港三级韩国三级日本三级| 日韩电影一区二区三区四区| 亚洲五月激情网| aaa欧美日韩| 91无套直看片红桃在线观看| 午夜私人影院久久久久| 日本一区二区三区久久| 欧美日韩综合视频| 青青草av在线播放| 欧美日韩综合一区| 蜜桃视频久久一区免费观看入口| 一区二区三区四区在线观看视频| 91小视频xxxx网站在线| 国产成人精品综合| 亚洲精品一区二区三区在线| 亚洲精品免费网站| 亚洲人成伊人成综合图片| 看欧美日韩国产| 亚洲成人三区| 黑鬼大战白妞高潮喷白浆| 久久xxxx| 风韵丰满熟妇啪啪区老熟熟女| 国产欧美综合色| 内射毛片内射国产夫妻| 亚洲视频在线二区| 欧美办公室脚交xxxx| 国产精品一区二区在线| 日韩美女国产精品| 在线观看污视频| 日本v片在线高清不卡在线观看| 大桥未久恸哭の女教师| **网站欧美大片在线观看| 国产熟妇久久777777| 亚洲精品国产无天堂网2021| 国产精品第六页| 亚洲精品久久久久久久久久久久久 | 日韩av不卡一区二区| 国产熟女高潮一区二区三区| 亚洲免费大片在线观看| 亚洲综合精品视频| 欧美日本免费一区二区三区| 日本国产在线| 91精品国产91久久久久久| 8x国产一区二区三区精品推荐| 综合久久国产| 久久国产人妖系列| 无码人妻少妇色欲av一区二区| 国产三级一区二区三区| 国产九色在线播放九色| 337p日本欧洲亚洲大胆精品 | 少妇高潮一区二区三区69| 欧美激情欧美激情在线五月| 日韩一区二区三区在线看| 久久久无码中文字幕久...| 国产乱码精品一区二区三| 成人涩涩小片视频日本| 亚洲最大成人网4388xx| 九一国产在线观看| 亚洲第一男人天堂| aa国产成人| 国产亚洲一区在线播放| 精品9999| 成人性生活免费看| 欧美国产97人人爽人人喊| 亚洲va在线观看| 国产亚洲欧美日韩精品| 国产一区一一区高清不卡| 日韩欧美一区二区三区四区 | 天天干天天曰天天操| av不卡一区二区三区| 国产在线欧美在线| 日韩av在线最新| 亚洲第一影院| 亚洲免费不卡| 韩国午夜理伦三级不卡影院| 2018天天弄| 亚洲第一区中文字幕| 最近高清中文在线字幕在线观看1| 欧美xxxx黑人又粗又长精品| 日韩高清一级片| 免费黄色激情视频| 色综合天天综合在线视频| 国产综合在线观看| 国产精品入口免费视频一| 日本成人中文| 日本成人在线免费视频| 国产精品视频你懂的| 国产色片在线观看| 久久久在线观看| 成人在线啊v| 免费在线黄网站| 久久噜噜亚洲综合| 91中文字幕在线播放| 欧美激情18p| 欧美精品尤物在线观看| 992kp免费看片| 福利视频导航一区| 国产午夜精品久久久久免费视| 国产z一区二区三区| 97国产精品| 国产精品69页| 亚洲欧美在线aaa| 噜噜噜久久,亚洲精品国产品| 欧美最猛性xxxxx(亚洲精品)| 色欧美自拍视频| 蜜臀aⅴ国产精品久久久国产老师| 色哟哟一区二区| 在线黄色网页| 天天爽天天狠久久久| 床上的激情91.|