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

成年人免费大片| 国产精品海角社区在线观看| 精品国产aⅴ一区二区三区东京热| 337p粉嫩大胆噜噜噜鲁| 日本激情一区二区| 美女日韩在线中文字幕| 在线日韩精品视频| 黑人巨大猛交丰满少妇| 黄色在线网站噜噜噜| 国产日韩精品一区| 成人网在线观看| www.av麻豆| 久久理论电影| 亚洲成人精品视频| www欧美激情| 国产在线拍揄自揄拍视频| 久久蜜桃一区二区| 亚洲在线视频福利| 精产国品一区二区| 欧美激情视频一区二区三区在线播放| 日韩高清人体午夜| 成人免费黄色av| 欧美大片高清| 亚洲一区在线观看网站| 午夜精品电影在线观看| 国内爆初菊对白视频| 美女免费视频一区| 欧美一级片在线播放| 岛国毛片在线观看| 欧美aaaa视频| 亚洲乱亚洲乱妇无码| 日韩大尺度视频| 欧美成a人片免费观看久久五月天| 性做久久久久久| 男女啪啪的视频| 极品美乳网红视频免费在线观看| 国产成人午夜精品影院观看视频 | 91久久久久久久久| 三级视频在线观看| 亚洲成人原创| 欧美黑人又粗大| 黄色录像免费观看| 波多野结衣一区| 国产丝袜视频一区| 日韩aaaaa| 亚洲视频一起| 日韩一级在线观看| 一二三级黄色片| 国产亚洲欧美日韩精品一区二区三区 | 日本成人一区二区三区| 精彩视频一区二区| 国产精品www网站| 日韩精品成人在线| 在线看片欧美| 久久久久久18| 久久久久久免费观看| 亚洲一区在线| 大胆欧美人体视频| 中日韩一级黄色片| 99久久婷婷国产综合精品电影√| 在线中文字幕日韩| 国产精品www爽爽爽| 国产一区二区电影在线观看| 亚洲老头同性xxxxx| 欧美黑人欧美精品刺激| 亚洲黄页网站| 亚洲小视频在线观看| 亚洲第一综合网| 国产探花在线精品| 欧美激情xxxx性bbbb| 成人精品在线视频| 中文字幕码精品视频网站| 视频一区视频二区中文字幕| 亚洲人成人一区二区在线观看| 久久国产日韩欧美| 亚洲色大成网站www| 久久人人爽爽爽人久久久| 欧美久久电影| 99中文字幕一区| 国产精品久久久久久久久晋中 | 超碰精品在线| 日韩av影片在线观看| 少妇光屁股影院| 青青草成人影院| 精品国产一区av| 日韩va亚洲va欧美va清高| 欧美黄色免费| 2019av中文字幕| 精品视频一二三区| 紧缚奴在线一区二区三区| 99re视频| 日本天堂在线| 国产精品美女一区二区三区| 女同性恋一区二区| 成人免费观看在线观看| 在线精品视频一区二区三四| 手机免费av片| 国产精品nxnn| 国产午夜精品美女视频明星a级| 日韩在线视频免费看| 国产一区观看| 国产成人91久久精品| 国产精品毛片一区二区在线看舒淇| 国产99精品国产| 日本精品一区二区三区不卡无字幕| 日本高清中文字幕在线| 亚洲高清不卡在线观看| 99视频在线视频| 伊人精品综合| 色噜噜国产精品视频一区二区| 免费人成年激情视频在线观看| 新67194成人永久网站| 91精品视频在线| 深夜视频在线免费| 亚洲免费观看高清在线观看| 黑森林福利视频导航| 国产亚洲观看| 永久免费看mv网站入口亚洲| 日韩三级av在线| 精品一区二区在线观看| 久久亚洲国产精品日日av夜夜| 成人av福利| 在线观看不卡视频| 人妻av一区二区| 亚洲国产精品成人| 国产精品69久久久久| 亚洲奶汁xxxx哺乳期| 国产精品高潮久久久久无| 国产精品秘入口18禁麻豆免会员| 欧美激情精品| 丝袜美腿精品国产二区| 久久久精品毛片| 成人黄色小视频在线观看| 伊人狠狠色丁香综合尤物| 亚洲精品中文字幕| 亚洲国产高清高潮精品美女| 日本妇女毛茸茸| 美女mm1313爽爽久久久蜜臀| 欧美性xxxx69| free性m.freesex欧美| 日韩一区二区免费在线电影| 人人艹在线视频| 视频一区二区三区在线| 鲁丝一区鲁丝二区鲁丝三区| 日本不良网站在线观看| 欧美精品一区二区三区在线| 久久香蕉精品视频| 国产精品自拍一区| 国产精品日韩欧美综合| 久久久久亚洲av无码专区首jn| 国产欧美日韩精品一区二区免费 | 一区视频在线| 亚洲综合自拍一区| 大地资源网3页在线观看| 欧美日韩精品欧美日韩精品 | 久国内精品在线| 国产日韩欧美一区二区东京热 | 久久艹精品视频| 国产在线看一区| 看一级黄色录像| 精品欧美视频| 久久久久国产一区二区三区| 亚洲欧美另类综合| 欧美日韩国内自拍| 无码h肉动漫在线观看| 久久亚洲视频| 亚洲国内在线| 久久久久九九精品影院| 欧美大秀在线观看| 人妻精品一区一区三区蜜桃91| 亚洲午夜在线电影| 国产熟女高潮一区二区三区 | 国产男女无套免费网站| 一区二区三区日韩在线观看| 精品人妻在线视频| 国产情侣一区| 日韩亚洲视频在线| 亚洲福利影视| 久久久久久久爱| 亚洲欧美日韩成人在线| 欧美在线免费视屏| 国模无码国产精品视频| 成人网男人的天堂| 久热免费在线观看| 国产精品国产三级国产在线观看 | 亚洲色图美女| 国产国语videosex另类| fc2在线中文字幕| 欧美日韩综合在线| 亚洲一区电影在线观看| eeuss影院一区二区三区| 日韩a在线播放| 国产精品91av| 亚洲综合色站| 国产精品久久国产精品| 男人av在线播放| 亚洲加勒比久久88色综合| 亚洲另类在线观看| 国产精品国产三级国产aⅴ原创 | 国内揄拍国内精品久久| 精品国产乱码久久久久软件| 欧美xxx网站| 日韩在线视频一区| 亚洲乱码在线观看| 欧美色图免费看| 九九热视频精品| 91蜜桃婷婷狠狠久久综合9色| 91激情视频在线| 综合亚洲视频| 久久艳妇乳肉豪妇荡乳av| 黄页免费欧美| 久久久久国产一区二区三区| 求av网址在线观看| 精品国产污污免费网站入口| 天天干天天插天天射| 亚洲激情图片小说视频| 成人免费毛片日本片视频| 麻豆精品视频在线观看免费| 丁香六月激情网| 精品欧美久久| 亚洲www视频| 午夜无码国产理论在线| 欧美日韩国产成人在线| 国产午夜视频在线观看| 欧美一区二区网站| 亚洲天堂中文字幕在线| 婷婷中文字幕一区三区| 三级黄色在线观看| 91视频免费播放| 在线精品视频播放| 久久er99精品| 国产aaa一级片| 欧美第一精品| 日韩精品国内| 久久综合五月婷婷| 91最新在线免费观看| av在线私库| 国语对白做受69| 91精品久久| 永久555www成人免费| 亚洲成人中文字幕在线| 欧美电影一区二区| 波多野结衣高清视频| 精品女厕一区二区三区| 国产高潮国产高潮久久久91| 国产精品天美传媒沈樵| 欧美熟妇精品黑人巨大一二三区| 国产黄色91视频| 久久黄色一级视频| 精品亚洲成a人在线观看| 任你操这里只有精品| 国产亚洲网站| av免费播放网址| 亚洲麻豆视频| 亚洲一区二区三区av无码| 一区二区三区毛片免费| 天堂av在线中文| 色天天综合网| 亚洲欧美精品| 久久视频在线| 激情五月六月婷婷| 欧美精品91| 久久精品无码中文字幕| 水蜜桃久久夜色精品一区| 亚洲欧洲一二三| 久久国产亚洲| 中文字幕制服丝袜在线| 亚洲欧美校园春色| 日本一区二区视频| 国产日产一区| 亚洲国产综合自拍| 欧美黄色免费| 久久手机在线视频| 亚洲精品日本| 欧美a v在线播放| 日韩激情在线观看| 欧美三级午夜理伦三级富婆| 日本不卡的三区四区五区| youjizzxxxx18| 国产精品综合av一区二区国产馆| 手机看片国产精品| 成人一区二区三区| 在线视频 日韩| 97aⅴ精品视频一二三区| 少妇献身老头系列| 99麻豆久久久国产精品免费 | 在线观看中文字幕视频| 欧美色videos| 中文字幕av在线免费观看| 日韩欧美在线网站| 黄色av免费观看| 日韩精品在线免费| 精品欧美不卡一区二区在线观看| 日韩视频永久免费观看| 欧美亚洲天堂| 欧美专区第一页| 精品一区91| 精品一区二区日本| 欧美三级美国一级| 一区二区不卡在线视频 午夜欧美不卡'| 天天影视天天精品| 日韩亚洲欧美视频| 免费成人在线观看| 小毛片在线观看| 中国av一区二区三区| 美女毛片在线观看| 欧美日韩国产系列| 你懂的网站在线| 中文字幕av一区二区| 国产乱色在线观看| 国产经典一区二区| 日本免费精品| 欧美18视频| 激情自拍一区| 亚洲视频第二页| 26uuu久久天堂性欧美| 青花影视在线观看免费高清| 亚欧色一区w666天堂| 国产又大又粗又硬| 日韩电影视频免费| jizz亚洲| 欧美在线播放视频| 精品一区二区三区中文字幕视频| 久久久久久a亚洲欧洲aⅴ| 欧美成人亚洲| wwwwww.色| av在线这里只有精品| 激情小说中文字幕| 欧美亚洲国产一区在线观看网站| 亚洲黄色一级大片| 一区二区三区天堂av| 免费电影网站在线视频观看福利| 国产一区私人高清影院| 亚洲警察之高压线| 艳母动漫在线免费观看| 久久97超碰色| 99久久精品免费视频| 亚洲国产视频一区| 亚洲国产精品久久久久久6q| 中文字幕在线看视频国产欧美在线看完整| caopeng在线| 91香蕉电影院| 色综合天天爱| 青青草av网站| 国产午夜精品久久久久久免费视| 国产无遮挡免费视频| 3d动漫精品啪啪一区二区竹菊 | 老熟妇仑乱一区二区av| 精品国产乱码久久久久久闺蜜| 中文字幕在线观看网站| 国产综合久久久久久| 欧美一级本道电影免费专区| 91视频最新入口| 北岛玲一区二区三区四区| 久久亚洲国产成人精品性色| 日韩精品一区二区三区在线播放 | 日韩欧美一区二区三区久久婷婷| 99精品国产福利在线观看免费| 亚洲精品乱码久久| 午夜精品福利视频网站| 国产日韩免费视频| 欧美极品美女视频网站在线观看免费 | 久久久久毛片免费观看| 中文字幕中文字幕在线中心一区 | 久久久精品影院| 国产成人免费av一区二区午夜| 亚洲视频电影| 蜜臀精品一区二区三区在线观看| 91制片厂在线| 91精品国产aⅴ一区二区| 里番在线观看网站| 91在线免费看片| 激情六月综合| 黄色录像a级片| 在线观看亚洲一区| a黄色在线观看| 国产男女猛烈无遮挡91| 欧美片第1页综合| 中文字幕乱码一区| 一本到一区二区三区| 岛国在线视频| 国产日韩av高清| 在线欧美一区| 自拍偷拍中文字幕| 欧美伊人久久久久久久久影院| 香港伦理在线| 5566av亚洲| 亚洲精品护士| 在线观看天堂av| 日韩一级在线观看| www视频在线观看| 亚洲欧美日韩国产成人综合一二三区| 激情亚洲综合在线| www.av成人| 亚洲免费伊人电影在线观看av| 日韩一级二级| 女人被男人躁得好爽免费视频 | 国产成人无码精品| 国产一区二区三区视频| xxxx日韩|