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

基于MINA構建高性能的NIO應用

開發 后端
MINA是非常好的C/S架構的java服務器,這里轉了一篇關于它的使用感受。

MINA是非常好的C/S架構的java服務器,這里轉了一篇關于它的使用感受。

前  言

MINA是Trustin Lee最新制作的Java通訊框架。通訊框架的主要作用是封裝底層IO操作,提供高級的操作API。比較出名的通訊框架有C++的ACE、Python的Twisted,而Java的通訊框架還有QuickServer、Netty2、Cindy、Grizzly等。

2004年6月,Trustin Lee發布了一個通訊框架Netty2,是Java界第一個事件模型架構的通訊框架,Cindy也從中借鑒了不少思想。由于Netty2的架構不是很好,Trustin Lee在2004年底加入Apache Directory組之后,重寫了整個框架,取名為MINA。MINA是一個基于Java NIO的通訊框架,Java從1.4開始引入NIO,提供了一個非阻塞、高性能的IO底層。

目前使用MINA的產品并不是很多,比較出名的就有Apache Directory、Openfire(Jive出品的一個XMPP產品)、red5(研究flash流媒體flv技術的朋友應該很清楚這個東西,adobe fms的競爭者,國內也有視頻網站在使用)等等。

筆者在07年初的時候,公司新項目需要用Java實現一個Socket Server,對比了Netty2、Cindy、QuickServer和MINA。當時Netty2已經停止開發,也找不到官方網站和代碼,比較了另外三個框架之后,毅然選擇了當時文檔比較缺乏和使用群較少的MINA,一年以來的使用經驗來看,感覺還是很不錯的,MINA有著清晰的架構,很方便做自定義的擴充。在1.0發布之后,官方網站充實了很多,增加了不少文檔,也聽到越來越多的朋友開始使用MINA。后來專門針對JDK 1.5發布了1.1的版本,使用JDK內置的concurrent代替backport-util-concurrent。目前1.0和1.1同時存在,但已經不再增加新功能,僅僅發布bug fix的版本,新功能都在2.0中實現,2.0調整了架構,性能有更大的提升,目前還在開發中。

基本特性

通過Java NIO支持TCP和UDP協議,另外還支持RS232和VM內通訊。由于MINA有清晰的架構,你也能很簡單地實現一個底層網絡協議。目前不支持阻塞IO,似乎還沒有計劃支持,當然你可以在其之上實現一個阻塞的模型,不過按照筆者的經驗來說,非阻塞IO更適合Server端編程。

一個類似ServletFilter的過濾器模型。這是筆者認為MINA的精髓所在,通過引入過濾器模型,可以將一些非業務的功能獨立開來,層次更清晰,很有AOP的思想,可以很方便地進行日志、協議轉換、壓縮等等功能,還能在運行中動態增加或去掉功能。

可以直接使用底層的ByteBuffer,也可以使用用戶定義的消息Object和編碼方式。

高度可定制的線程模型,單線程、一個線程池,或者類似SEDA的多個線程池。

SSL支持,攻擊防御和流量控制,mock測試友好,JMX支持,Spring集成,你還需要更多嗎。

一個簡單的例子

MINA使用非常簡單,筆者以前做過一段時間傳統的Java Socket開發,不過一直對Java NIO不是很理解,但是MINA很快就上手了,MINA封裝了NIO繁瑣的部分,使你可以更專注于業務功能實現。話不多說,讓我們來看一個簡單的例子,一個很常見的例子,時間服務器。

我們的實現目標是一個能響應多個客戶端的請求,然后返回服務器當前的系統時間的功能。傳統的Java Socket程序,我們需要每accept一個客戶端連接,就創建一個新的線程來響應,這會令到系統整體負載能力有較大的限制,而且我們必須手工編寫連接管理等代碼。讓我們來看看MINA是怎么處理的。

首先我們從官方網站下載MINA 1.1,這里我們假設JDK為1.5以上的版本,如果你使用的是JDK 1.4,請下載MINA 1.0,MINA 1.0跟1.1幾乎一樣,但是強烈建議使用JDK 1.5以上以獲得更好的性能。

解開壓縮包之后,能看見很多jar包,這里暫不介紹每個包的具體作用,可以把所有包都導入項目。值得留意的是MINA使用了一個slf4j的日志庫,該日志庫大有取締common-logging之勢。 這里是我們的主程序,非常簡單。

首先我們需要一個IoAcceptor,這里我們選擇了一個SocketAcceptor,也就是TCP協議。

然后,我們給應用加上日志過濾器和協議編碼過濾器。

最后,我們把acceptor bind到本機的8123端口,并且使用TimeServerHandler來實現協議。

TimeServerHandler是我們實現具體業務功能的地方。 IoHandlerAdapter提供了7個事件方法,我們要做的事情僅僅是挑選我們需要做出響應的事件進行重載。在我這個例子了,我重載了兩個方法。sessionCreated會在客戶端連接的時候調用,通常我們會在這里進行一些初始化操作,我這里僅僅是打印一條信息。messageReceived就是整個Handler的中心部分,每一個從客戶端發過來的消息都會轉化成對該方法的調用。由于我們加入了協議編碼過濾器,因此這里獲得的Object msg是一個String,而不是默認的ByteBuffer(下文會詳細介紹ProtocolCodecFilter)。這里我們實現了一個很簡單的業務功能,如果用戶輸入的是quit,就斷開連接,否則就輸入當前時間。可以看出,IoSession封裝了對當前連接的操作。

至此,我們就實現了一個時間服務器。

  1. public class TimeServer {   
  2. public static void main(String[] args) throws IOException {   
  3. IoAcceptor acceptor = new SocketAcceptor();   
  4. SocketAcceptorConfig cfg = new SocketAcceptorConfig();   
  5. cfg.getFilterChain().addLast( "logger"new LoggingFilter() );   
  6. cfg.getFilterChain().addLast( "codec"new ProtocolCodecFilter( new TextLineCodecFactory()));   
  7. acceptor.bind( new InetSocketAddress(8123), new TimeServerHandler(), cfg);   
  8. System.out.println("Time server started.");   
  9. }  
  1. public class TimeServerHandler extends IoHandlerAdapter {   
  2.  public void messageReceived(IoSession session, Object msg) throws Exception {   
  3.  String str = (String) msg;   
  4.  if"quit".equalsIgnoreCase(str) ) {   
  5.  session.close();   
  6.  return;   
  7.  }   
  8.  
  9.  Date date = new Date();   
  10.  session.write( date.toString() );   
  11.  System.out.println("Message written...");   
  12.  }   
  13.    
  14.  public void sessionCreated(IoSession session) throws Exception {   
  15.  System.out.println("Session created...");   
  16.  }   

MINA架構

這里,我借用了一張Trustin Lee在Asia 2006的ppt里面的圖片來介紹MINA的架構。

Remote Peer就是客戶端,而下方的框是MINA的主要結構,各個框之間的箭頭代表數據流向。

大家可以對比剛剛的例子來看這個架構圖,IoService就是整個MINA的入口,負責底層的IO操作,客戶端發過來的消息就是由它處理。剛剛我們使用的IoAcceptor就是一個IoService,之所以抽象成IoService,是因為MINA用同樣的架構來處理服務器和客戶端編程,IoService的另一個子類就是IoConnector,用于客戶端。不過根據筆者的使用經驗,使用非阻塞的模型進行客戶端編程非常的不方便,你最好尋求其他的阻塞通訊框架。

IoService把數據轉化成一個一個的事件,傳遞給IoFilterChain。你可以加入一連串的IoFilter,進行各種功能。筆者的建議是將一些功能性的,業務不相關的代碼,用IoFilter來實現,使得整個應用結構更清晰,也方便代碼重用。

被IoFilter處理過的事件,發送給 IoHandler,然后我們在這里實現具體的業務邏輯。這個部分很簡單,如果你有Swing的使用經驗的話,你會發現它跟Swing的事件非常相像,你要做的事情,僅僅是重載你需要的方法,然后編寫具體的業務功能。在這其中,最重要的一個方法就是messageReceived了。

值得留意的是一個IoSession的類,每一個IoSession實例代表這一個連接,我們需要對連接進行的任何操作都通過這個類來實現。

從IoHandler通過調用IoSession.write等方法向客戶端發送的消息,會通過跟輸入數據相反的次序依次傳遞,直至由IoService負責把數據發送給客戶端。

這就已經是MINA的全部,是不是很簡單。

接下來,我會詳細介紹我們編寫具體代碼的時候主要涉及到的三個類,IoHandler、IoSession和IoFilter。

IoHandler

MINA的內部實現了一個事件模型,而IoHanlder則是所有事件最終產生響應的位置。每一個方法的名字很明確表明該事件的含義。messageReceived是接收客戶端消息的事件,我們應該在這里實現業務邏輯。messageSent是服務器發送消息的事件,一般情況下我們不會使用它。sessionClosed是客戶端斷開連接的事件,可以在這里進行一些資源回收等操作。值得留意的是,客戶端連接有兩個事件,sessionCreated和sessionOpened,兩者稍有不同,sessionCreated是由I/O processor線程觸發的,而sessionOpened在其后,由業務線程觸發的,由于MINA的I/O processor線程非常少,因此如果我們真的需要使用sessionCreated,也必須是耗時短的操作,一般情況下,我們應該把業務初始化的功能放在sessionOpened事件中。

細心的讀者可能會發現,我們剛剛的例子繼承的是IoHandlerAdapter,IoHandlerAdapter其實就是一個IoHanlder的空的實現,這樣我們就可以不用重載不感興趣的事件。

IoSession

IoSession是一個接口,MINA里很多的地方都使用接口,很好地體現了面向接口編程的思想。它提供了對當前連接的操作功能,還有用戶定義屬性的存儲功能,這點非常重要。IoSession是線程安全的,也就是我們能夠在多線程環境中隨意操作IoSession,這點給開發帶來很大的好處。我們來看看具體提供的方法,筆者列舉一些比較常用和重要的方法

在這里,筆者把IoSession的方法大致分成三類

第一類,連接操作功能。

最主要的方法有兩個,向客戶端發送消息和斷開連接。可以看的出,write接受的變量是一個Object,但是實際上應該傳入什么類型呢?具體還得看你是否使用了ProtocolCodecFilter(下面會詳細介紹),如果使用了ProtocolCodecFilter,那這個message將可能是一個String,或者是一個用戶定義的JavaBean。默認的情況,message是一個ByteBuffer。ByteBuffer是MINA的一個類,跟java.nio.ByteBuffer類同名,MINA 2.0將會將它改成IoBuffer,以避免討論上的誤會。

另一個值得留意的是Future類,MINA是一個非阻塞的通信框架,其中一個明顯的體現就是調用IoSession.write方法是不會阻塞的。用戶調用了write方法之后,消息內容會發到底層等候發送,至于什么時候發出,就不得而知了。當然,實際上調用了write之后,數據幾乎是立刻發出的,這得益與NIO的高性能。但是,如果我們必須確認了消息發出,然后進行某些處理,我們就需要使用Future類,以下是一個很常見的代碼。

通過調用future.join,程序就會阻塞,直至消息處理結束。我們還能通過future.isWritten得知消息是否成功發送。

在這里,筆者順便說一個實際使用的發現,消息發送是會自動合并的,簡單來說,如果在很短的時間里,對同一個IoSession進行了兩次write操作,客戶端有可能只收到一條消息,而這條消息就是服務器發出的兩條消息前后接起來。這樣的設計可以在高并發的時候節省網絡開銷,而筆者的實際使用過程中,效果也相當好。但是如果這樣行為會導致客戶端工作不正常,你也可以通過參數關閉它。

第二類,屬性存儲操作。

通常來說,我們的系統是有用戶狀態的,我們就需要在連接上存儲用戶屬性,IoSession的Attribute就是這樣一個功能。例如兩個連接同時連入服務器,一個連接是用戶A,用戶ID是13,另一個連接是用戶B,用戶ID是14,我們就可以在用戶登錄成功之后,調用IoSession.setAttribute(“login_id”,13),然后在其后的操作中,通過IoSession.getAttribute(“login_id”)獲得當前登錄用戶ID,并進行相應的操作。簡單來說,就是一個類似HttpSession的功能,當然具體的實現方法不一樣。

第三類,連接狀態。

這里就不多說了,從方法名上我們就能知道它具體的功能。

IoFilter

過濾器是MINA的一個很重要的功能。IoFilter也是一個接口,但是相對比較復雜,這里就不列舉它的方法了。簡單來說IoFilter就像ServletFilter,在事件被IoHandler處理之前或之后進行一些特定的操作,但是它比ServletFilter復雜,可以處理很多種事件,除了包括IoHandler的7個事件以外,還有一些內部的事件可以進行操作。

MINA提供了一些常用的IoFilter實現,例如有LoggingFilter(日志功能)、BlacklistFilter(黑名單功能)、CompressionFilter(壓縮功能)、SSLFilter(SSL支持),這些過濾器比較簡單,通過閱讀它們的源代碼,能夠更進一步理解過濾器的實現。筆者在這里要重點介紹兩個過濾器,ProtocolCodecFilter和ExecutorFilter

ProtocolCodecFilter

網絡傳輸的內容其實本質是一個二進制流,但是我們的業務功能不會,或者說不應該去直接操作二進制流。MINA默認向IoHandler傳入的message是一個ByteBuffer,如果我們直接在IoHandler操作ByteBuffer,會導致大量協議分析的代碼和實際的業務代碼混雜在一起。最適合的做法,就是在IoFilter把ByteBuffer轉換成String或者JavaBean,ProtocolCodecFilter正是這樣的一個功能的過濾器。

使用ProtocolCodecFilter很簡單,我們只要把ProtocolCodecFilter加入到FilterChain就可以了,但是我們需要提供一個ProtocolCodecFactory。其實ProtocolCodecFilter僅僅是實現了過濾器部分的功能,它會將最終的轉換工作,交給從ProtocolCodecFactory獲得的Encode和Decode。如果我們需要編寫自己的ProtocolCodec,就應該從ProtocolCodecFactory入手。MINA內置了幾個ProtocolCodecFactory,比較常用的就是ObjectSerializationCodecFactory和TextLineCodecFactory。

ObjectSerializationCodecFactory是Java Object序列化之后的內容直接跟ByteBuffer互相轉化,比較適合兩端都是Java的情況使用。TextLineCodecFactory就是String跟ByteBuffer的轉化,說白了就是文本,例如你要實現一個SMTP服務器,或者POP服務器,就可以使用它。而筆者的實際使用,大多數情況都是使用

TextLineCodecFactory

這里提及一下IoFilter的順序問題,IoFilter是有加入順序的,例如,先加入LoggingFilter再加入ProtocolCodecFilter,和先加入ProtocolCodecFilter再加入LoggingFilter的效果是不一樣的,前者LoggingFilter寫入日志的內容是ByteBuffer,而后者寫入日志的是轉換后具體的類,例如String。實際使用的時候,一定要處理好過濾器的順序。

ExecutorFilter

另一個重要的過濾器就是ExecutorFilter。這里,我需要先說明一下MINA的線程工作模式,MINA默認是單線程處理所有客戶端的消息,也就是說,即使你在一臺8CPU的機器上面跑,可能也只用到一個CPU,另外,如果某次消息處理太耗時,就會導致其他消息等待,整體的吞吐量下降。很多朋友抱怨MINA的性能差,其實是因為他們沒有加入ExecutorFilter的緣故。ExecutorFilter設計的很精巧,大家可以仔細閱讀一下源代碼,它會將同一個連接的消息合并起來按順序調用,不會出現兩個線程同時處理同一個連接的情況。

  1. 1.IoAcceptor acceptor = ...;   
  2. 2.IoServiceConfig acceptorConfig = acceptor.getDefaultConfig();   
  3. 3.acceptorConfig.setThreadModel(ThreadModel.MANUAL); 

這里再次提及IoFitler的順序問題,一般情況下,我們會將ExecutorFilter放在ProtocolCodecFilter之后,因為我們不需要多線程地執行ProtocolCodec操作,用單一線程來進行ProtocolCodec性能會比較高,而具體的業務邏輯可能還設計數據庫操作,因此更適合放在不同的線程中運行。

優化指南

MINA默認配置的性能并不是很高的,部分原因是MINA目前還保留初期版本的架構,另外一個原因是因為JVM的發展。

1.IoAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());
首先我們關閉默認的ThreadModel設置 ThreadModel是一個很簡單的線程實現,用于IoService。但是它實在太弱,以至于在并發環境產生大量問題。在MINA 2.0中,ThreadModel直接被取消。你應該使用ExecutorFilter來實現線程。

  1. acceptor.getDefaultConfig().getFilterChain().addLast("threadPool"new ExecutorFilter(Executors.newCachedThreadPool()); 

然后我們增加I/O處理線程

每一個Acceptor/Connector都使用一個線程來處理連接,然后把連接發送給I/O processor進行讀寫操作,我們只可以修改I/O processor使用的線程數,用以下代碼設置 當然是要將ExecutorFilter加入,上文已經很詳細地描述了 筆者在開發過程中,多次遇到OutOfMemoryError,經過研究之后才發現原因。MINA默認是使用direct memory實現ByteBuffer池的方案(以下簡稱direct buffer),通過JNI在內存開辟一段空間來使用,該方案在早期的MINA版本中是一個非常好的特性,那是因為MINA開發初期,JVM并沒有現在的強大,帶有池效果的direct buffer性能比較好。但是當我們使用-Xms -Xmx等指令增加JVM可使用的內存,那僅僅增加了堆的內存空間,而direct memory的空間并沒有增加,導致MINA實際使用的時候經常出現OutOfMemoryError。如果你的確想使用direct memory,可以通過-XX:MaxDirectMemorySize選項來設置。不過筆者不建議這樣做,因為最新的測試表明,在現代的JVM里面,direct memory比堆的表現更差。這里可能有讀者會覺得奇怪,為什么不用池,而要用堆呢,而且還需要gc。那是因為現在的JVM gc能力已經很強了,而且在并發環境里面,pool的同步也是一個性能的問題。我們可以通過這樣的代碼進行設置 MINA 2.0已經默認把直接內存分配改成堆,為了提供最好的性能和穩定性。

  1. ByteBuffer.setUseDirectBuffers(false);   
  2. ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); 

最后一條優化技巧就是,把你的應用部署在Linux上,并且打開Java NIO使用Linux epoll的功能。可能你還沒聽過epoll,但是你應該聽過Lighttpd、Nginx、Squid等,得益于epoll,它們提供很高的網絡性能,還占用非常少的系統資源。JDK6已經默認把epoll配置打開,因此筆者建議把你的應用部署在JDK6上面,也同時因為JDK6還有別的優化特性。如果你的應用必須部署在JDK5上,你也可以通過參數把epoll支持打開。

原文鏈接:http://blog.csdn.net/chenyi8888/article/details/5341916

【編輯推薦】

  1. Java NIO如何處理慢速的連接
  2. Java NIO2 AIO開發核心流程
  3. Java NIO開發實例
  4. Java NIO 聊天室實例
  5. 多線程NIO客戶端實例
責任編輯:林師授 來源: chenyi8888的博客
相關推薦

2009-06-03 14:24:12

ibmdwWebSphere

2025-02-05 12:09:12

2023-10-26 08:35:53

2023-12-26 00:58:53

Web應用Go語言

2016-05-20 14:20:31

ASP.NET建議

2023-09-04 14:52:48

2011-03-11 09:51:47

Java NIO

2023-07-12 08:24:19

Java NIO通道

2012-02-14 14:10:16

ibmdw

2020-06-05 07:20:41

測試自動化環境

2023-09-04 08:32:43

web開發圖像

2024-12-27 09:37:51

2022-12-09 08:40:56

高性能內存隊列

2011-10-21 14:20:59

高性能計算HPC虛擬化

2011-10-25 13:13:35

HPC高性能計算Platform

2009-11-30 09:40:23

Java 7 NIO2HTTP Server

2025-03-04 08:00:00

機器學習Rust開發

2025-06-03 08:15:00

微服務架構異步任務隊列

2009-10-29 09:11:50

Juniper高性能網絡

2023-12-01 07:06:14

Go命令行性能
點贊
收藏

51CTO技術棧公眾號

国产成人自拍在线| 婷婷综合视频| 欧美三级电影在线观看| 亚洲自拍偷拍二区| 亚洲欧美另类综合| 久久久久久久欧美精品| 久久精品视频中文字幕| 国模无码视频一区| 日韩高清成人| 亚洲资源在线观看| 青青草原亚洲| 国产91久久久| 另类调教123区| 国精产品一区一区三区有限在线| 久久精品国产亚洲av久| 国产精品久久久久久久久久久久久久久| 亚洲综合丝袜美腿| 亚洲精品电影在线一区| 日韩一级在线播放| 黑人精品欧美一区二区蜜桃| 欧美一区二区三区四区在线| 午夜爱爱毛片xxxx视频免费看| 美国成人xxx| 91精品蜜臀在线一区尤物| 国产女大学生av| 亚洲www色| 欧美国产日韩a欧美在线观看| 99在线观看| 国产又粗又黄又爽| 久久久久久久高潮| 69**夜色精品国产69乱| 欧美另类videoxo高潮| 精品一区在线| 亚洲精品美女在线观看| 先锋资源在线视频| 欧美综合社区国产| 在线观看亚洲a| 777米奇影视第四色| 成人福利影视| 亚洲精品国久久99热| 亚洲蜜桃av| yjizz视频网站在线播放| 91香蕉视频在线| 国语精品中文字幕| 性网爆门事件集合av| 国内精品国产三级国产a久久| 国产精品成人va在线观看| 国产毛片aaa| 99在线观看免费视频精品观看| 欧美成人精品三级在线观看| 在线观看天堂av| 日韩中文首页| 中国日韩欧美久久久久久久久| 女尊高h男高潮呻吟| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲第一精品电影| 男女一区二区三区| 牛牛视频精品一区二区不卡| 精品国产乱码久久久久久浪潮| 性一交一黄一片| 136福利精品导航| 日韩欧美亚洲另类制服综合在线| 一本之道在线视频| 日韩精品久久久久久久软件91| 91精品国产免费| 国内自拍第二页| 日本一区二区三区视频在线看 | 国产人成亚洲第一网站在线播放| 久久99国产精品| 国产在线网站| 中文字幕在线一区二区三区| 亚洲一区二区在线免费观看| 免费观看久久久久| 亚洲免费视频中文字幕| 日韩精品一区二区免费| 欧美巨大丰满猛性社交| 色婷婷综合久久久中文一区二区 | 国产精品亲子伦av一区二区三区| 欧美私人免费视频| 一级网站在线观看| 99re6热只有精品免费观看| 亚洲精品久久久久| 妺妺窝人体色WWW精品| 四虎成人av| 欧美噜噜久久久xxx| 日韩欧美大片在线观看| 日韩影院精彩在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产白浆在线观看| 91香蕉国产在线观看软件| 亚洲毛片aa| 俺来也官网欧美久久精品| 欧美三级欧美成人高清www| 免费激情视频在线观看| 欧美高清hd| 亚洲区在线播放| 久久久久久视频| 亚洲制服av| 国产日韩一区在线| 人妻va精品va欧美va| 国产欧美日韩精品a在线观看| 欧美 国产 精品| 香蕉成人av| 欧美成人女星排行榜| 尤物视频最新网址| 欧美va亚洲va日韩∨a综合色| 91精品国产免费久久久久久| 一级片一区二区三区| 成人激情视频网站| 中文字幕99| 中文一区一区三区高中清不卡免费| 欧美日韩精品专区| 亚洲av无码国产精品久久| 91精品电影| 国产91色在线|免| 免费观看a视频| 最新国产精品久久精品| 欧美成人黑人猛交| 国产伦理久久久久久妇女| 日韩在线视频网站| 成人免费视频国产免费| 岛国精品在线播放| 99re99热| 久久婷婷五月综合色丁香| 日韩av网站导航| 久久伊人成人网| 狠狠色丁香久久婷婷综合_中| 欧美精品七区| 国产高潮在线| 日韩精品一区二区三区在线观看| 在线观看日本黄色| 蜜桃久久av| 牛人盗摄一区二区三区视频| 国产黄色大片在线观看| 91精品国产美女浴室洗澡无遮挡| 三区四区在线观看| 久久综合九色| 欧美福利一区二区三区| 九色porny自拍视频在线观看| 精品少妇一区二区三区日产乱码 | 91九色国产在线| 超碰国产在线观看| 在线观看欧美精品| 一级黄色片网址| 天堂在线亚洲视频| 日本不卡久久| 国产一区一一区高清不卡| 精品视频偷偷看在线观看| 国产欧美日韩另类| 99久久久精品| 国产免费毛卡片| 中文字幕中文字幕精品| 欧美在线视频播放| 深夜福利视频一区| 色综合网站在线| 亚洲 小说 欧美 激情 另类| 日日夜夜免费精品| 天堂一区二区三区| 欧美黑粗硬大| 欧美xxxx做受欧美.88| 性生交生活影碟片| 性久久久久久久久| 波多野结衣av在线免费观看| 久久精品国语| 水蜜桃亚洲精品| 亚洲成人a级片| 欧美另类极品videosbest最新版本 | 亚洲成av人片在线观看无| 亚洲三级观看| 欧美精品一区二区三区在线看午夜 | 色999日韩| 91在线高清免费观看| 牛牛在线精品视频| 国产视频在线观看一区二区| 人人妻人人爽人人澡人人精品 | 亚洲黄色中文字幕| 中文字幕日韩在线视频| 国产婷婷一区二区三区久久| 亚洲最大成人网4388xx| 国产亚洲无码精品| 男人的j进女人的j一区| 91免费版看片| 亚州av一区| 国产日本欧美在线观看| 中文字幕免费高清电视剧网站在线观看| 日韩欧美国产麻豆| 国产一级淫片a视频免费观看| 国产日产欧美一区二区视频| 精品久久久99| 99亚洲精品| 中文字幕一区二区三区四区五区 | 私库av在线播放| 91影院在线观看| 91极品视频在线观看| 亚洲电影av| 一区二区精品免费视频| 精品福利一区| 成人啪啪免费看| 美女网站在线看| 久久久av亚洲男天堂| 亚洲 欧美 精品| 4438x成人网最大色成网站| 国产欧美日韩另类| 亚洲男女一区二区三区| 亚洲天堂网一区二区| 国产精品一区不卡| 99久久激情视频| 日韩午夜av| 天天干天天操天天干天天操| 天堂在线精品| 豆国产97在线| 欧美日韩破处视频| 日韩免费在线观看视频| 国产精品蜜臀| 精品中文字幕在线| 伊人免费在线| 亚洲日韩中文字幕| 日本黄色一区二区三区| 91麻豆精品国产| 做爰视频毛片视频| 日韩欧美一区二区三区| 国产精品a成v人在线播放| 日韩毛片高清在线播放| 欧美狂猛xxxxx乱大交3| 不卡一区在线观看| 中文在线字幕观看| 黑人精品欧美一区二区蜜桃| 最新中文字幕2018| 天堂成人国产精品一区| 日韩精品一区二区三区四| 欧美日韩在线二区| 日韩hmxxxx| 国产区精品区| 欧美国产二区| 天天操综合520| 精品久久久久久一区二区里番| 亚洲成人偷拍| 97人人做人人人难人人做| 91成人精品观看| 成人午夜在线视频一区| 亚洲毛片在线免费| 成人国产精品久久久| 精品福利在线| 国产精自产拍久久久久久| 91欧美精品| 国产欧洲精品视频| 日韩亚洲国产免费| 91精品久久久久久久久不口人| 播放一区二区| 国产精品男人爽免费视频1| 123成人网| 国产精品嫩草视频| 亚洲一区二区小说| 97超级碰碰| japanese色系久久精品| 国产精品美女xx| 清纯唯美亚洲经典中文字幕| 好吊色欧美一区二区三区视频| 欧美wwwsss9999| 欧美黄色直播| 四季av一区二区凹凸精品| 伊人久久大香线蕉av一区| 欧美一区亚洲| 性欧美大战久久久久久久| 国产日韩欧美一区在线| 欧美精品成人网| 另类小说视频一区二区| 精品人妻人人做人人爽夜夜爽| 成人免费视频一区二区| 97伦伦午夜电影理伦片| 欧美国产一区二区在线观看| 日本不卡一二区| 亚洲高清一区二区三区| 成年人晚上看的视频| 6080午夜不卡| 五月婷婷久久久| 中文字幕亚洲欧美在线| 亚洲综合影视| 日韩av免费在线播放| 91精品一区| 久久久久久久久久久一区| 成人在线免费观看91| 久久久99精品视频| 新67194成人永久网站| 999久久久精品视频| www.久久精品| 看黄色录像一级片| 欧美色欧美亚洲高清在线视频| 亚洲综合成人av| 欧美v亚洲v综合ⅴ国产v| 国产小视频免费在线观看| 欧美精品中文字幕一区| 国产精品极品美女在线观看| 亚洲一区中文字幕| 久久91麻豆精品一区| 老牛影视免费一区二区| 在线视频亚洲欧美中文| 日韩三级电影网站| 久久在线电影| 国产三区在线视频| 狠狠色狠狠色综合系列| 五月天综合视频| 亚洲精品免费电影| 国产性生活视频| 亚洲高清久久网| 最新电影电视剧在线观看免费观看| 在线视频精品一| аⅴ资源天堂资源库在线| 国产精品一区二区久久久久| 欧美三级电影在线| 二级片在线观看| 亚洲欧美成人综合| 少妇献身老头系列| 国产精品欧美一区喷水| 国产在线视频你懂的| 欧美一区日韩一区| 黄色片免费在线| 欧美黑人巨大xxx极品| 丁香婷婷久久| 鲁丝一区鲁丝二区鲁丝三区| 午夜精品视频| 日本三级黄色网址| 99精品久久只有精品| 久久免费小视频| 欧美日韩夫妻久久| 99青草视频在线播放视| 91国内在线视频| 欧美成年网站| 国产女人18毛片| 美腿丝袜亚洲综合| 无码国产精品一区二区免费式直播| 国产精品国产三级国产普通话蜜臀| 好吊操这里只有精品| 亚洲成年人在线播放| 韩国av网站在线| 国产精品网站视频| 日韩在线中文| jizzzz日本| 亚洲欧美在线视频观看| 成人小视频在线播放| 精品一区二区三区四区在线| 日韩精品av| 国产一区二区精品在线| 99人久久精品视频最新地址| 杨幂一区二区国产精品| 亚洲欧洲一区二区三区| 国产精品久久久久久免费| 在线视频免费一区二区| 黑人巨大亚洲一区二区久| 欧美一区二区三区四区夜夜大片 | 欧美一级三级| av在线播放亚洲| 不卡电影免费在线播放一区| 国产高潮国产高潮久久久91| 欧美在线观看视频一区二区三区| 国产不卡精品视频| 欧美精品18videos性欧| 99a精品视频在线观看| 日本在线xxx| 91丨九色丨蝌蚪丨老版| 免费看日批视频| 国产亚洲精品综合一区91| 午夜欧美巨大性欧美巨大| 亚洲欧美日韩国产成人综合一二三区| 肉丝袜脚交视频一区二区| 国产免费嫩草影院| 欧美日韩激情在线| jizz性欧美| 国严精品久久久久久亚洲影视| 国产一区二区你懂的| 最近中文字幕在线mv视频在线| 日本精品视频一区二区| 精品av中文字幕在线毛片| 国产精品一区二区三| 亚洲激情中文| 国产真实乱人偷精品| 色综合天天在线| 国产美女av在线| 99国产超薄肉色丝袜交足的后果| 欧美色图首页| 国产一区二区三区精品在线| 欧美日韩精品欧美日韩精品| 欧美理论电影| 欧美福利精品| 老司机精品视频一区二区三区| 永久免费未视频| 日韩精品一区二区三区四区视频| 亚洲十八**毛片| 一区二区三区不卡在线| 成人av在线影院| 91丨九色丨海角社区| 亚洲人成在线观看| 深夜福利一区| 韩国日本在线视频| 一区二区日韩电影| 日本人妖在线| 99在线观看视频网站| 久久久久99| 国产午夜精品无码| 尤物tv国产一区|