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

初試Java 7 NIO2:實現高性能的HTTP Server

開發 后端
NIO.2是針對Java中I/O功能的一系列增強,計劃在Java 7中發布。在現在的Java 7里程碑版本中已經可以使用這個功能,本文作者描述了自己利用NIO2特性實現高性能Java HTTP Server的方法。

本文來自DoubleH的BlogJava博客,原文標題為《JDK7 NIO2 實踐: 增加 TransmitFile支持》。對于Java 7 NIO2特性的更多描述,可參考以前Google的一次技術演講

#t#JDK7的NIO2特性或許是我最期待的,我一直想基于它寫一個高性能的Java Http Server.現在這個想法終于可以實施了。

本人基于目前最新的JDK7 b76開發了一個HTTP Server性能確實不錯。

在windows平臺上NIO2采用AccpetEx來異步接受連接,并且讀寫全都關聯到IOCP完成端口。不僅如此,為了方便開發者使用,連IOCP工作線程都封裝好了,你只要提供線程池就OK。

但是要注意,IOCP工作線程的線程池必須是 Fix的,因為你發出的讀寫請求都關聯到相應的線程上,如果線程死了,那讀寫完成情況是不知道的。

作為一個Http Server,傳送文件是必不可少的功能,那一般文件的傳送都是要把程序里的buffer拷貝到內核的buffer,由內核發送出去的。windows平臺上為這種情況提供了很好的解決方案,使用TransmitFile接口

  1. BOOL TransmitFile(  
  2.     SOCKET hSocket,  
  3.     HANDLE hFile,  
  4.     DWORD nNumberOfBytesToWrite,  
  5.     DWORD nNumberOfBytesPerSend,  
  6.     LPOVERLAPPED lpOverlapped,  
  7.     LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,  
  8.     DWORD dwFlags  
  9. ); 

你只要把文件句柄發送給內核就行了,內核幫你搞定其余的,真正做到Zero-Copy.

但是很不幸,NIO2里AsynchronousSocketChannel沒有提供這樣的支持。而為HTTP Server的性能考量,本人只好自己增加這個支持。

要無縫支持,這個必須得表現的跟 Read /Write一樣,有完成的通知,通知傳送多少數據,等等。

仔細讀完sun的IOCP實現以后發現這部分工作他們封裝得很好,基本只要往他們的框架里加東西就好了。

為了能訪問他們的框架代碼,我定義自己的TransmitFile支持類在sun.nio.ch包里,以獲得最大的權限。

  1. package sun.nio.ch;  
  2.  
  3. import java.io.IOException;  
  4. import java.lang.reflect.Field;  
  5. import java.nio.channels.AsynchronousCloseException;  
  6. import java.nio.channels.AsynchronousSocketChannel;  
  7. import java.nio.channels.ClosedChannelException;  
  8. import java.nio.channels.CompletionHandler;  
  9. import java.nio.channels.NotYetConnectedException;  
  10. import java.nio.channels.WritePendingException;  
  11. import java.util.concurrent.Future;  
  12.  
  13.  
  14. /**  
  15.  * @author Yvon  
  16.  *   
  17.  */ 
  18. public class WindowsTransmitFileSupport {  
  19.      
  20.    //Sun's NIO2 channel  implementation class   
  21.     private WindowsAsynchronousSocketChannelImpl channel;  
  22.      
  23.     //nio2 framework core data structure  
  24.     PendingIoCache ioCache;  
  25.  
  26.    //some field retrieve from sun channel implementation class   
  27.     private Object writeLock;  
  28.     private Field writingF;  
  29.     private Field writeShutdownF;  
  30.     private Field writeKilledF; // f  
  31.  
  32.     WindowsTransmitFileSupport()  
  33.     {  
  34.         //dummy one for JNI code  
  35.     }  
  36.  
  37.     /**  
  38.      *   
  39.      */ 
  40.     public WindowsTransmitFileSupport(  
  41.             AsynchronousSocketChannel  
  42.              channel) {  
  43.  
  44.         this.channel = (WindowsAsynchronousSocketChannelImpl)channel;  
  45.         try {  
  46.         // Initialize the fields  
  47.             Field f = WindowsAsynchronousSocketChannelImpl.class 
  48.                     .getDeclaredField("ioCache");  
  49.             f.setAccessible(true);  
  50.             ioCache = (PendingIoCache) f.get(channel);  
  51.             f = AsynchronousSocketChannelImpl.class 
  52.                     .getDeclaredField("writeLock");  
  53.             f.setAccessible(true);  
  54.             writeLock = f.get(channel);  
  55.             writingF = AsynchronousSocketChannelImpl.class 
  56.                     .getDeclaredField("writing");  
  57.             writingF.setAccessible(true);  
  58.  
  59.             writeShutdownF = AsynchronousSocketChannelImpl.class 
  60.                     .getDeclaredField("writeShutdown");  
  61.             writeShutdownF.setAccessible(true);  
  62.  
  63.             writeKilledF = AsynchronousSocketChannelImpl.class 
  64.                     .getDeclaredField("writeKilled");  
  65.             writeKilledF.setAccessible(true);  
  66.  
  67.         } catch (NoSuchFieldException e) {  
  68.             // TODO Auto-generated catch block  
  69.             e.printStackTrace();  
  70.         } catch (SecurityException e) {  
  71.             // TODO Auto-generated catch block  
  72.             e.printStackTrace();  
  73.         } catch (IllegalArgumentException e) {  
  74.             // TODO Auto-generated catch block  
  75.             e.printStackTrace();  
  76.         } catch (IllegalAccessException e) {  
  77.             // TODO Auto-generated catch block  
  78.             e.printStackTrace();  
  79.         }  
  80.     }  
  81.  
  82.       
  83.     /**  
  84.      * Implements the task to initiate a write and the handler to consume the  
  85.      * result when the send file completes.  
  86.      */ 
  87.     private class SendFileTask implements Runnable, Iocp.ResultHandler {  
  88.         private final PendingFuture result;  
  89.         private final long file;//file is windows file HANDLE  
  90.  
  91.         SendFileTask(long file, PendingFuture result) {  
  92.             this.result = result;  
  93.             this.file = file;  
  94.         }  
  95.  
  96.       
  97.  
  98.         @Override 
  99.         // @SuppressWarnings("unchecked")  
  100.         public void run() {  
  101.             long overlapped = 0L;  
  102.             boolean pending = false;  
  103.             boolean shutdown = false;  
  104.  
  105.             try {  
  106.                 channel.begin();  
  107.  
  108.           
  109.  
  110.                 // get an OVERLAPPED structure (from the cache or allocate)  
  111.                 overlapped = ioCache.add(result);  
  112.                 int n = transmitFile0(channel.handle, file, overlapped);  
  113.                 if (n == IOStatus.UNAVAILABLE) {  
  114.                     // I/O is pending  
  115.                     pending = true;  
  116.                     return;  
  117.                 }  
  118.                 if (n == IOStatus.EOF) {  
  119.                     // special case for shutdown output  
  120.                     shutdown = true;  
  121.                     throw new ClosedChannelException();  
  122.                 }  
  123.                 // write completed immediately  
  124.                 throw new InternalError("Write completed immediately");  
  125.             } catch (Throwable x) {  
  126.                 // write failed. Enable writing before releasing waiters.  
  127.                 channel.enableWriting();  
  128.                 if (!shutdown && (x instanceof ClosedChannelException))  
  129.                     x = new AsynchronousCloseException();  
  130.                 if (!(x instanceof IOException))  
  131.                     x = new IOException(x);  
  132.                 result.setFailure(x);  
  133.             } finally {  
  134.                 // release resources if I/O not pending  
  135.                 if (!pending) {  
  136.                     if (overlapped != 0L)  
  137.                         ioCache.remove(overlapped);  
  138.                   
  139.                 }  
  140.                 channel.end();  
  141.             }  
  142.  
  143.             // invoke completion handler  
  144.             Invoker.invoke(result);  
  145.         }  
  146.  
  147.           
  148.  
  149.         /**  
  150.          * Executed when the I/O has completed  
  151.          */ 
  152.         @Override 
  153.         @SuppressWarnings("unchecked")  
  154.         public void completed(int bytesTransferred, boolean canInvokeDirect) {  
  155.       
  156.  
  157.             // release waiters if not already released by timeout  
  158.             synchronized (result) {  
  159.                 if (result.isDone())  
  160.                     return;  
  161.                 channel.enableWriting();  
  162.  
  163.                 result.setResult((V) Integer.valueOf(bytesTransferred));  
  164.  
  165.             }  
  166.             if (canInvokeDirect) {  
  167.                 Invoker.invokeUnchecked(result);  
  168.             } else {  
  169.                 Invoker.invoke(result);  
  170.             }  
  171.         }  
  172.  
  173.         @Override 
  174.         public void failed(int error, IOException x) {  
  175.             // return direct buffer to cache if substituted  
  176.           
  177.  
  178.             // release waiters if not already released by timeout  
  179.             if (!channel.isOpen())  
  180.                 x = new AsynchronousCloseException();  
  181.  
  182.             synchronized (result) {  
  183.                 if (result.isDone())  
  184.                     return;  
  185.                 channel.enableWriting();  
  186.                 result.setFailure(x);  
  187.             }  
  188.             Invoker.invoke(result);  
  189.         }  
  190.  
  191.     }  
  192.  
  193.     public extends Number, A> Future sendFile(long file, A att,  
  194.             CompletionHandlersuper A> handler) {  
  195.  
  196.         boolean closed = false;  
  197.         if (channel.isOpen()) {  
  198.             if (channel.remoteAddress == null)  
  199.                 throw new NotYetConnectedException();  
  200.  
  201.               
  202.             // check and update state  
  203.             synchronized (writeLock) {  
  204.                 try{  
  205.                 if (writeKilledF.getBoolean(channel))  
  206.                     throw new IllegalStateException(  
  207.                             "Writing not allowed due to timeout or cancellation");  
  208.                 if (writingF.getBoolean(channel))  
  209.                     throw new WritePendingException();  
  210.                 if (writeShutdownF.getBoolean(channel)) {  
  211.                     closed = true;  
  212.                 } else {  
  213.                     writingF.setBoolean(channel, true);  
  214.                 }  
  215.                 }catch(Exception e)  
  216.                 {  
  217.                     IllegalStateException ise=new IllegalStateException(" catch exception when write");  
  218.                     ise.initCause(e);  
  219.                     throw ise;  
  220.                 }  
  221.             }  
  222.         } else {  
  223.             closed = true;  
  224.         }  
  225.  
  226.         // channel is closed or shutdown for write  
  227.         if (closed) {  
  228.             Throwable e = new ClosedChannelException();  
  229.             if (handler == null)  
  230.                 return CompletedFuture.withFailure(e);  
  231.             Invoker.invoke(channel, handler, att, null, e);  
  232.             return null;  
  233.         }  
  234.  
  235.  
  236.  
  237.         return implSendFile(file,att,handler);  
  238.     }  
  239.  
  240.  
  241.     extends Number, A> Future implSendFile(long file, A attachment,  
  242.             CompletionHandlersuper A> handler) {  
  243.         // setup task  
  244.         PendingFuture result = new PendingFuture(channel, handler,  
  245.                 attachment);  
  246.         SendFileTask sendTask=new SendFileTask(file,result);  
  247.         result.setContext(sendTask);  
  248.         // initiate I/O (can only be done from thread in thread pool)  
  249.         // initiate I/O  
  250.         if (Iocp.supportsThreadAgnosticIo()) {  
  251.             sendTask.run();  
  252.         } else {  
  253.             Invoker.invokeOnThreadInThreadPool(channel, sendTask);  
  254.         }  
  255.         return result;  
  256.     }  
  257.       
  258.     private native int transmitFile0(long handle, long file,  
  259.             long overlapped);  
  260.       
  261. }  
  262.  

這個操作跟默認實現的里的write操作是很像的,只是最后調用的本地方法不一樣。。

接下來,我們怎么使用呢,這個類是定義在sun的包里的,直接用的話,會報IllegalAccessError,因為我們的類加載器跟初始化加載器是不一樣的。

解決辦法一個是通過啟動參數-Xbootclasspath,讓我們的包被初始加載器加載。我個人不喜歡這種辦法,所以就采用JNI來定義我們的windows TransmitFile支持類。

這樣我們的工作算是完成了,注意,發送文件的時候傳得是文件句柄,這樣做的好處是你可以更好的控制,一般是在發送前,打開文件句柄,完成后在回調通知方法里關閉文件句柄。

有興趣的同學可以看看我的HTTP server項目:

http://code.google.com/p/jabhttpd/

目前基本功能實現得差不多,做了些簡單的測試,性能比較滿意。這個服務器不打算支持servlet api,基本是專門給做基于長連接模式通信的定做的。

責任編輯:yangsai 來源: BlogJava
相關推薦

2009-12-14 10:44:51

Java 7NIO2

2011-12-15 11:39:25

JavaNIO

2020-03-11 10:09:57

JAVA詳解classpath

2011-03-11 09:51:47

Java NIO

2023-07-12 08:24:19

Java NIO通道

2011-12-15 13:28:57

2015-11-10 09:25:05

HTTP2提升性能

2019-03-27 10:50:50

HTTP請求管線式

2023-09-06 12:01:50

HTTP協議信息

2011-12-15 09:55:47

javanio

2024-12-25 14:03:03

2011-12-13 09:12:34

JavaNIO

2011-04-07 13:39:24

WebHTTP

2023-07-28 08:23:05

選擇器Java NIO

2024-09-06 07:55:42

2024-03-20 08:00:00

軟件開發Java編程語言

2021-07-27 16:01:29

高并發定時器高性能

2024-07-31 08:31:13

2019-04-08 10:09:04

CPU緩存高性能

2021-08-12 16:42:09

WireGuardWindows內核NT
點贊
收藏

51CTO技術棧公眾號

理论不卡电影大全神| 国产精品自拍第一页| xvideos.蜜桃一区二区| 欧美日韩美女在线观看| 欧美凹凸一区二区三区视频 | 日韩欧美在线视频观看| 亚洲高清123| 欧美特黄一级视频| 蜜桃免费网站一区二区三区 | 桃色av一区二区| 国产精品毛片久久久久久久| 国产伦精品一区二区三区在线| 日本一本在线观看| 亚洲天堂偷拍| 久久精品国产亚洲精品| 99久久人妻精品免费二区| 青娱乐极品盛宴一区二区| 天天综合网天天综合色| 国产欧美自拍视频| 久久精品日产第一区二区三区乱码 | 国产xxxx振车| 免费网站看v片在线a| 99riav久久精品riav| 91色精品视频在线| 国产在线一级片| 中文日韩欧美| 欧美国产日韩xxxxx| 欧美一级特黄高清视频| 免费观看不卡av| 亚洲成在人线av| 1314成人网| 激情久久一区二区| 色系网站成人免费| a√天堂在线观看| 国产又色又爽又黄刺激在线视频| 中文字幕在线不卡国产视频| 玛丽玛丽电影原版免费观看1977| 精品国产亚洲av麻豆| 久久黄色级2电影| 国产精品福利片| 五月天激情四射| 午夜在线视频观看日韩17c| 欧美激情aaaa| 久久精品www人人爽人人| 婷婷综合视频| 久久激情五月丁香伊人| 岛国片在线免费观看| 国产精品亚洲人成在99www| 日韩精品在线观看一区二区| 亚洲婷婷在线观看| 大桥未久女教师av一区二区| 精品奇米国产一区二区三区| 日韩高清一二三区| 中文字幕日韩高清在线| 日韩美女视频在线| 国产欧美视频一区| 九色丨蝌蚪丨成人| 日韩国产欧美区| 菠萝菠萝蜜网站| 亚洲性视频大全| 亚洲人成五月天| 亚洲最大成人综合网| 精品久久一区| 日韩一区二区三区在线播放| 99成人在线观看| 欧美日韩国内| 97成人精品区在线播放| 日韩人妻精品中文字幕| 秋霞午夜av一区二区三区| 国产精品人成电影在线观看| 亚洲综合一区中| 国产剧情av麻豆香蕉精品| 99中文视频在线| 五月婷婷六月激情| 国产日韩欧美在线一区| 在线观看免费黄色片| 91国内在线| 欧美日韩国产丝袜美女| 三级在线免费看| 国产精久久一区二区| 精品国产乱码久久久久久图片| 催眠调教后宫乱淫校园| 欧美欧美黄在线二区| www.午夜精品| 日本少妇在线观看| 欧美aⅴ一区二区三区视频| 亚洲www视频| 三级毛片在线免费看| 国产精品美女一区二区三区| 亚洲激情免费视频| 波多野结衣久久精品| 欧美美女bb生活片| 日本三级日本三级日本三级极| 亚洲影院天堂中文av色| 久久五月天综合| 欧美黑人一区二区| 国产麻豆欧美日韩一区| 久久涩涩网站| av片在线观看网站| 日韩欧美在线播放| 亚洲熟女乱综合一区二区| 久草成人在线| 欧美黑人狂野猛交老妇| 国产一区二区视频免费| 豆国产96在线|亚洲| 亚洲精品一区二区三区樱花| 91破解版在线观看| 欧美手机在线视频| 亚洲精品乱码久久久久久久| 五月天综合网站| 国产成人91久久精品| 丰满少妇高潮在线观看| 国产精品伦理在线| 国产精品97在线| aiai久久| 欧美www在线| 一区二区视频网站| 久久免费精品国产久精品久久久久| 91九色国产ts另类人妖| 97欧美成人| 日韩精品在线私人| 国产一级片免费观看| 九九精品视频在线看| 日本不卡在线播放| 性感女国产在线| 精品国产电影一区二区| a级片在线观看免费| 久久国产综合精品| 日韩片电影在线免费观看| 国产乱码精品一区二三赶尸艳谈| 欧美一区二区精品久久911| 国产aaaaaaaaa| 日本中文字幕不卡| 日本一区二区久久精品| 成人欧美一区二区三区的电影| 亚洲国产另类久久精品| 精品视频在线观看免费| 国产精品自拍在线| 99中文字幕在线观看| 亚洲午夜剧场| 久久综合久久八八| 国产女人高潮的av毛片| 亚洲欧洲制服丝袜| 99久久99精品| 91精品天堂福利在线观看| 成人写真福利网| a视频在线观看免费| 91精品国产高清一区二区三区| 免费精品在线视频| 国产精品影音先锋| 台湾无码一区二区| 懂色av一区二区| 97成人在线视频| 男女视频在线观看| 在线观看成人小视频| 日本一二三不卡视频| 免费看欧美女人艹b| 伊人久久大香线蕉综合75| 亚洲国产一区二区久久| 欧美大肥婆大肥bbbbb| 午夜精品在线播放| 五月开心婷婷久久| 亚洲精品国产熟女久久久| 免费欧美在线视频| 性做爰过程免费播放| 综合久久成人| 欧美孕妇性xx| 婷婷在线视频观看| 日韩欧美成人激情| 日韩精品无码一区二区| 久久久久久久久97黄色工厂| 中文字幕国内自拍| 亚洲欧美综合| 快播亚洲色图| 日韩亚洲国产免费| 久久久久久噜噜噜久久久精品| 无码精品人妻一区二区| 欧美中文字幕亚洲一区二区va在线| www.99re6| 成人av免费在线观看| 天天摸天天碰天天添| 93在线视频精品免费观看| 亚洲最大av网| 樱花草涩涩www在线播放| 在线观看欧美视频| 亚洲精品国产一区二| 欧美日韩亚洲一区二区三区| wwwww黄色| 成人激情午夜影院| 日韩av片网站| 亚洲欧洲一级| 中文字幕黄色大片| 色天下一区二区三区| 国产日韩在线看| 国产免费拔擦拔擦8x高清在线人| 国产亚洲精品美女久久久久| 国产黄色片免费| 日本高清免费不卡视频| 国产一级一级片| 国产精品天天摸av网| 国产十八熟妇av成人一区| 久久精品国产精品亚洲红杏| 免费看国产曰批40分钟| 国产精品福利在线观看播放| 九色91视频| 91精品短视频| 国产日韩欧美在线看| 小草在线视频免费播放| 久久6精品影院| 成人在线免费观看| 日韩av在线免播放器| 国产激情视频在线播放| 欧美三级视频在线播放| 久久国产视频精品| 午夜在线电影亚洲一区| 九九热最新地址| 欧美韩国日本不卡| 免费a级黄色片| 国产suv精品一区二区6| 天天色天天综合网| 青青草精品视频| 欧美女人性生活视频| 亚洲成人中文| 成人午夜视频免费观看| 亚洲成人日韩| 在线观看亚洲视频啊啊啊啊| 精品国产一区探花在线观看| 激情视频一区二区| 黄色免费大全亚洲| 国产欧美日韩一区| 成人自拍在线| 不卡一区二区三区视频| 久久亚洲精精品中文字幕| 成人国产亚洲精品a区天堂华泰| 88xx成人网| 国产精品亚洲自拍| 国产精品久久久久久久久久齐齐| 日韩美女中文字幕| 日本综合字幕| 国产福利视频一区| 日本在线中文字幕一区二区三区 | 国产精品免费av一区二区| 亚洲综合丝袜美腿| 精品无码m3u8在线观看| 一个色综合av| 精品少妇theporn| 午夜私人影院久久久久| 国产精品6666| 亚洲二区视频在线| 精品美女久久久久| 色婷婷精品大视频在线蜜桃视频| 日日噜噜噜噜人人爽亚洲精品| 一本大道久久精品懂色aⅴ| 无码人妻精品一区二区| 在线观看日韩毛片| 97人妻精品一区二区三区软件| 欧美高清视频一二三区| 国产成人av免费看| 亚洲国产精品福利| 青青久在线视频免费观看| 国产亚洲欧洲黄色| 国内精品久久久久久野外| 欧美乱大交xxxxx| 阿v视频在线| 国产精品爱久久久久久久| 成人18视频在线观看| 成人淫片在线看| 操欧美女人视频| 欧美日韩亚洲一区二区三区在线观看 | 亚洲韩国青草视频| 你懂的视频在线| 日韩有码在线观看| eeuss鲁一区二区三区| 欧美影院在线播放| 亚洲视频自拍| 国产一区不卡在线观看| 国产伦精品一区二区三区千人斩 | 亚洲国产影院| 欧美日韩在线免费播放| 精品一区二区三区在线播放| 农村末发育av片一区二区| 久久亚洲精精品中文字幕早川悠里 | 97av视频在线观看| 久久精品国产在热久久| 亚洲图片综合网| 国产精品入口麻豆九色| 久久精品第一页| 欧美影院一区二区三区| 亚洲精品911| 最近中文字幕日韩精品| 2021中文字幕在线| 国产中文欧美精品| 日韩高清成人在线| 男人j进女人j| 日韩av一区二区三区| 熟女人妻一区二区三区免费看| 久久久不卡影院| 国产精品不卡av| 欧美卡1卡2卡| 国产中文字幕在线观看| 九九精品在线视频| 福利一区二区| 欧美裸体网站| 欧美三级不卡| 色天使在线观看| 久久奇米777| 日本三级理论片| 91精品国产一区二区三区香蕉| 久青草国产在线| 欧美又大粗又爽又黄大片视频| 亚洲一区二区三区免费| 亚洲午夜精品一区二区| 美女网站久久| 手机在线成人av| 一级精品视频在线观看宜春院 | 久草视频在线免费看| 欧美久久一区二区| 啊v视频在线| 日本精品免费观看| 日韩av中文字幕一区| 国产欧美日韩小视频| 国产成人在线视频网站| 一级性生活免费视频| 欧美三电影在线| av在线日韩国产精品| 日韩免费视频在线观看| 亚洲最大在线| 欧美一区二区三区爽大粗免费| 国产91丝袜在线播放九色| 欧美成人aaa片一区国产精品| 7799精品视频| 黄色成人影院| 成人情趣片在线观看免费| 日本久久黄色| 亚洲综合婷婷久久| 欧美高清在线精品一区| 黄色污污网站在线观看| 国产视频精品在线| 中文字幕这里只有精品| 久久亚洲午夜电影| 国产精品普通话对白| 亚洲av无码一区二区三区网址| 亚洲国产精品天堂| 特黄aaaaaaaaa真人毛片| 国产+成+人+亚洲欧洲| 老牛国内精品亚洲成av人片| a级黄色一级片| 久久综合狠狠综合久久综合88| 亚洲免费在线视频观看| 国产亚洲欧美另类中文| 97精品国产99久久久久久免费| 亚洲欧洲三级| 国产精品一区免费视频| 精品无码人妻一区二区三区品| 亚洲精品一区二区在线观看| av最新在线| 日本一区二区三区在线视频| 麻豆精品新av中文字幕| 国产盗摄一区二区三区在线| 精品国产一区二区三区久久久蜜月 | 午夜欧美在线| 久久久国产精品久久久| 性久久久久久久久| 激情在线视频| 成人免费直播live| 亚洲三级视频| 性欧美精品男男| 欧美一区二区三区免费观看视频 | 欧美国产日本| 国产chinese中国hdxxxx| 色综合久久综合网97色综合| 北条麻妃在线| 成人看片视频| 久久一本综合频道| 免费在线观看黄色小视频| 亚洲精品一区二区三区香蕉| 美女100%一区| 亚洲小说欧美另类激情| 99久久精品国产导航| 国产成人精品一区二区色戒| 久久国产天堂福利天堂| 欧美调教视频| 国产精品嫩草影院8vv8 | 波多野结衣黄色| 欧美成人一区在线| 亚洲精品进入| 日本人dh亚洲人ⅹxx| 色香蕉成人二区免费| 日本三级韩国三级欧美三级| 奇米视频888战线精品播放| 国产乱子伦一区二区三区国色天香| 久久艹免费视频| www.久久久久久.com| 秋霞影视一区二区三区| 九九九九九国产| 日韩欧美第一页| 欧美性猛片xxxxx免费中国 | 国产精品成人一区二区网站软件| 一色道久久88加勒比一| 精品成人私密视频|