3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 9 揭秘(14. HTTP/2 Client API)

發布時間:2025/7/25 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 9 揭秘(14. HTTP/2 Client API) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tips
做一個終身學習的人。

在此章中,主要介紹以下內容:

  • 什么是HTTP/2 Client API
  • 如何創建HTTP客戶端
  • 如何使HTTP請求
  • 如何接收HTTP響應
  • 如何創建WebSocket的endpoints
  • 如何將未經請求的數據從服務器推送到客戶端

JDK 9將HTTP/2 Client API作為名為jdk.incubator.httpclient的孵化器模塊。 該模塊導出包含所有公共API的jdk.incubator.http包。 孵化器模塊不是Java SE的一部分。 在Java SE 10中,它將被標準化,并成為Java SE 10的一部分,否則將被刪除。 請參閱 http://openjdk.java.net/jeps/11上的網頁,以了解有關JDK中孵化器模塊的更多信息。

孵化器模塊在編譯時或運行時未被默認解析,因此需要使用--add-modules選項將jdk.incubator.httpclient模塊添加到默認的根模塊中,如下所示:

<javac|java|jmod...> -add-modules jdk.incubator.httpclient ...

如果另一個模塊讀取并解析了第二個模塊,則也相應解析了孵化器模塊。 在本章中,將創建一個讀取jdk.incubator.httpclient模塊的模塊,不必使用-add-modules選項來解析。

因為孵化器模塊提供的API還不是最終的,當在編譯時或運行時使用孵化器模塊時,會在標準錯誤上打印警告。 警告信息如下所示:

WARNING: Using incubator modules: jdk.incubator.httpclient

孵化器模塊的名稱和包含孵化器API的軟件包以jdk.incubator開始。 一旦它們被標準化并包含在Java SE中,它們的名稱將被更改為使用標準的Java命名約定。 例如,模塊名稱jdk.incubator.httpclient可能會在Java SE 10中成為java.httpclient。

因為jdk.incubator.httpclient模塊不在Java SE中,所以將不會為此模塊找到Javadoc。 為了生成此模塊的Javadoc,并將其包含在本書的源代碼中。 可以使用下載的源代碼中的Java9Revealed/jdk.incubator.httpclient/dist/javadoc/index.html文件訪問Javadoc。 使用JDK 9早期訪問構建158的JDK版本來生成Javadoc。 API可能會改變,可能需要重新生成Javadoc。 以下是具體的步驟:

  • 源代碼包含與項目名稱相同目錄中的jdk.incubator.httpclient NetBeans項目。
  • 安裝JDK 9時,其源代碼將作為src.zip文件復制到安裝目錄中。 將所有內容從src.zip文件中的jdk.incubator.httpclient目錄復制到下載的源代碼中的Java9revealed\jdk.incubator.httpclient\src目錄中。
  • 在NetBeans中打開jdk.incubator.httpclient項目。
  • 右鍵單擊NetBeans中的項目,然后選擇“生成Javadoc”選項。 你會收到錯誤和警告,可以忽略。 它將在Java9Revealed/jdk.incubator.httpclient/dist/javadoc目錄中生成Javadoc。 打開此目錄中的index.html文件,查看jdk.incubator.httpclient模塊的Javadoc。
  • 一. 什么是HTTP/2 Client API?

    自JDK 1.0以來,Java已經支持HTTP/1.1。 HTTP API由java.net包中的幾種類型組成。 現有的API有以下問題:

    • 它被設計為支持多個協議,如http,ftp,gopher等,其中許多協議不再被使用。
    • 太抽象了,很難使用。
    • 它包含許多未公開的行為。
    • 它只支持一種模式,阻塞模式,這要求每個請求/響應有一個單獨的線程。

    2015年5月,IETF(Internet Engineering Task Force)發布了HTTP/2規范。 有關HTTP/2規范的完整文本,請訪問https://tools.ietf.org/html/rfc7540。 HTTP/2不會修改應用程序級語義。 也就是說,對應用程序中的HTTP協議的了解和使用情況并沒有改變。 它具有更有效的方式準備數據包,然后發送到客戶端和服務器之間的電線。 所有之前知道的HTTP,如HTTP頭,方法,狀態碼,URL等都保持不變。 HTTP/2嘗試解決與HTTP/1連接所面臨的許多性能相關的問題:

    • HTTP/2支持二進制數據交換,來代替HTTP/1.1支持的文本數據。
    • HTTP/2支持多路復用和并發,這意味著多個數據交換可以同時發生在TCP連接的兩個方向上,而對請求的響應可以按順序接收。 這消除了在對等體之間具有多個連接的開銷,這在使用HTTP/1.1時通常是這種情況。 在HTTP/1.1中,必須按照發送請求的順序接收響應,這稱為head-of-line阻塞。 HTTP/2通過在同一TCP連接上進行復用來解決線路阻塞問題。
    • 客戶端可以建議請求的優先級,服務器可以在對響應進行優先級排序時予以遵守。
    • HTTP首部(header)被壓縮,這大大降低了首部大小,從而降低了延遲。
    • 它允許從服務器到客戶端的資源推送。

    JDK 9不是更新現有的HTTP/1.1 API,而是提供了一個支持HTTP/1.1和HTTP/2的HTTP/2 Client API。 該API旨在最終取代舊的API。 新API還包含使用WebSocket協議開發客戶端應用程序的類和接口。 有關完整的WebSocket協議規范,請訪問https://tools.ietf.org/html/rfc6455。 新的HTTP/2客戶端API與現有的API相比有以下幾個好處:

    • 在大多數常見情況下,學習和使用簡單易用。
    • 它提供基于事件的通知。 例如,當收到首部信息,收到正文并發生錯誤時,會生成通知。
    • 它支持服務器推送,這允許服務器將資源推送到客戶端,而客戶端不需要明確的請求。 它使得與服務器的WebSocket通信設置變得簡單。
    • 它支持HTTP/2和HTTPS/TLS協議。
    • 它同時工作在同步(阻塞模式)和異步(非阻塞模式)模式。

    新的API由不到20種類型組成,其中有四種是主要類型。 當使用這四種類型時,會使用其他類型。 新API還使用舊API中的幾種類型。 新的API位于jdk.incubator.httpclient模塊中的jdk.incubator.http包中。 主要類型有三個抽象類和一個接口:

    HttpClient class HttpRequest class HttpResponse class WebSocket interface

    HttpClient類的實例是用于保存可用于多個HTTP請求的配置的容器,而不是為每個HTTP請求單獨設置它們。 HttpRequest類的實例表示可以發送到服務器的HTTP請求。 HttpResponse類的實例表示HTTP響應。 WebSocket接口的實例表示一個WebSocket客戶端。 可以使用Java EE 7 WebSocket API創建WebSocket服務器。

    使用構建器創建HttpClient,HttpRequest和WebSocket的實例。 每個類型都包含一個名為Builder的嵌套類/接口,用于構建該類型的實例。 請注意,不用創建HttpResponse,它作為所做的HTTP請求的一部分返回。 新的HTTP/2 Client API非常簡單,只需在一個語句中讀取HTTP資源! 以下代碼段使用GET請求,以URL https://www.google.com/作為字符串讀取內容:

    String responseBody = HttpClient.newHttpClient().send(HttpRequest.newBuilder(new URI("https://www.google.com/")).GET().build(), BodyHandler.asString()).body();

    處理HTTP請求的典型步驟如下:

    • 創建HTTP客戶端對象以保存HTTP配置信息。
    • 創建HTTP請求對象并使用要發送到服務器的信息進行填充。
    • 將HTTP請求發送到服務器。
    • 接收來自服務器的HTTP響應對象作為響應。
    • 處理HTTP響應。

    二. 設置案例

    在本章中使用了許多涉及與Web服務器交互的例子。 不是使用部署在Internet上的Web應用程序,而是在NetBeans中創建了一個可以在本地部署的Web應用程序項目。 如果更喜歡使用其他Web應用程序,則需要更改示例中使用的URL。

    NetBeans Web應用程序位于源代碼的webapp目錄中。 通過在GlassFish服務器4.1.1和Tomcat 8/9上部署Web應用程序來測試示例。 可以從https://netbeans.org/下載帶有GlassFish服務器的NetBeans IDE。 在8080端口的GlassFish服務器上運行HTTP監聽器。如果在另一個端口上運行HTTP監聽器,則需要更改示例URL中的端口號。

    本章的所有HTTP客戶端程序都位于com.jdojo.http.client模塊中,其聲明如下所示。

    // module-info.java module com.jdojo.http.client {requires jdk.incubator.httpclient; }

    三. 創建HTTP客戶端

    HTTP請求需要將配置信息發送到服務器,以便服務器知道要使用的身份驗證器,SSL配置詳細信息,要使用的cookie管理器,代理信息,服務器重定向請求時的重定向策略等。 HttpClient類的實例保存這些特定于請求的配置,它們可以重用于多個請求。 可以根據每個請求覆蓋其中的一些配置。 發送HTTP請求時,需要指定將提供請求的配置信息的HttpClient對象。 HttpClient包含用于所有HTTP請求的以下信息:驗證器,cookie管理器,執行器,重定向策略,請求優先級,代理選擇器,SSL上下文,SSL參數和HTTP版本。

    認證者是java.net.Authenticator類的實例。 它用于HTTP身份驗證。 默認是不使用驗證器。

    Cookie管理器用于管理HTTP Cookie。 它是java.net.CookieManager類的一個實例。 默認是不使用cookie管理器。

    執行器是java.util.concurrent.Executor接口的一個實例,用于發送和接收異步HTTP請求和響應。 如果未指定,則提供默認執行程序。

    重定向策略是HttpClient.Redirect枚舉的常量,它指定如何處理服務器的重定向問題。 默認值NEVER,這意味著服務器發出的重定向不會被遵循。

    請求優先級是HTTP/2請求的默認優先級,可以在1到256(含)之間。 這是服務器優先處理請求的一個提示。 更高的值意味著更高的優先級。

    代理選擇器是java.net.ProxySelector類的一個實例,用于選擇要使用的代理服務器。 默認是不使用代理服務器。

    SSL上下文是提供安全套接字協議實現的javax.net.ssl.SSLContext類的實例。當不需要指定協議或不需要客戶端身份驗證時, 提供了一個默認的SSLContext,此選項將起作用。

    SSL參數是SSL/TLS/DTLS連接的參數。 它們保存在javax.net.ssl.SSLParameters類的實例中。

    HTTP版本是HTTP的版本,它是1.1或2.它被指定為HttpClient.Version枚舉的常量:HTTP_1_1和HTTP_2。 它盡可能請求一個特定的HTTP協議版本。 默認值為HTTP_1_1。

    Tips
    HttpClient是不可變的。 當構建這樣的請求時,存儲在HttpClient中的一些配置可能會被HTTP請求覆蓋。

    HttpClient類是抽象的,不能直接創建它的對象。 有兩種方法可以創建一個HttpClient對象:

    • 使用HttpClient類的newHttpClient()靜態方法
    • 使用HttpClient.Builder類的build()方法

    以下代碼段獲取默認的HttpClient對象:

    // Get the default HttpClient HttpClient defaultClient = HttpClient.newHttpClient();

    也可以使用HttpClient.Builder類創建HttpClient。 HttpClient.newBuilder()靜態方法返回一個新的HttpClient.Builder類實例。 HttpClient.Builder類提供了設置每個配置值的方法。 配置的值被指定為方法的參數,該方法返回構建器對象本身的引用,因此可以鏈接多個方法。 最后,調用返回HttpClient對象的build()方法。 以下語句創建一個HttpClient,重定向策略設置為ALWAYS,HTTP版本設置為HTTP_2:

    // Create a custom HttpClient HttpClient httpClient = HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.ALWAYS).version(HttpClient.Version.HTTP_2).build();

    HttpClient類包含對應于每個配置設置的方法,該設置返回該配置的值。 這些方法如下:

    Optional<Authenticator> authenticator() Optional<CookieManager> cookieManager() Executor executor() HttpClient.Redirect followRedirects() Optional<ProxySelector> proxy() SSLContext sslContext() Optional<SSLParameters> sslParameters() HttpClient.Version version()

    請注意,HttpClient類中沒有setter方法,因為它是不可變的。 不能使用HttpClient自己本身的對象。 在使用HttpClient對象向服務器發送請求之前,需要使用HttpRequest對象。HttpClient類包含以下三種向服務器發送請求的方法:

    <T> HttpResponse<T> send(HttpRequest req, HttpResponse.BodyHandler<T> responseBodyHandler) <T> CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest req, HttpResponse.BodyHandler<T> responseBodyHandler) <U,T> CompletableFuture<U> sendAsync(HttpRequest req, HttpResponse.MultiProcessor<U,T> multiProcessor)

    send()方法同步發送請求,而sendAsync()方法異步發送請求。

    四. 處理HTTP請求

    客戶端應用程序使用HTTP請求與Web服務器進行通信。 它向服務器發送一個請求,服務器發回對應的HTTP響應。 HttpRequest類的實例表示HTTP請求。 以下是處理HTTP請求所需執行的步驟:

    • 獲取HTTP請求構建器(builder)
    • 設置請求的參數
    • 從構建器創建HTTP請求
    • 將HTTP請求同步或異步發送到服務器
    • 處理來自服務器的響應

    1. 獲取HTTP請求構建器

    需要使用構建器對象,該對象是HttpRequest.Builder類的實例來創建一個HttpRequest。 可以使用HttpRequest類的以下靜態方法獲取HttpRequest.Builder:

    HttpRequest.Builder newBuilder() HttpRequest.Builder newBuilder(URI uri)

    以下代碼片段顯示了如何使用這些方法來獲取HttpRequest.Builder實例:

    // A URI to point to google URI googleUri = new URI("http://www.google.com"); // Get a builder for the google URI HttpRequest.Builder builder1 = HttpRequest.newBuilder(googleUri); // Get a builder without specifying a URI at this time HttpRequest.Builder builder2 = HttpRequest.newBuilder();

    2. 設置HTTP請求參數

    擁有HTTP請求構建器后,可以使用構建器的方法為請求設置不同的參數。 所有方法返回構建器本身,因此可以鏈接它們。 這些方法如下:

    HttpRequest.Builder DELETE(HttpRequest.BodyProcessor body) HttpRequest.Builder expectContinue(boolean enable) HttpRequest.Builder GET() HttpRequest.Builder header(String name, String value) HttpRequest.Builder headers(String... headers) HttpRequest.Builder method(String method, HttpRequest.BodyProcessor body) HttpRequest.Builder POST(HttpRequest.BodyProcessor body) HttpRequest.Builder PUT(HttpRequest.BodyProcessor body) HttpRequest.Builder setHeader(String name, String value) HttpRequest.Builder timeout(Duration duration) HttpRequest.Builder uri(URI uri) HttpRequest.Builder version(HttpClient.Version version)

    使用HttpClient將HttpRequest發送到服務器。 當構建HTTP請求時,可以使用version()方法通過HttpRequest.Builder對象設置HTTP版本值,該方法將在發送此請求時覆蓋HttpClient中設置的HTTP版本。 以下代碼片段將HTTP版本設置為2.0,以覆蓋默認HttpClient對象中的NEVER的默認值:

    // By default a client uses HTTP 1.1. All requests sent using this // HttpClient will use HTTP 1.1 unless overridden by the request HttpClient client = HttpClient.newHttpClient();// A URI to point to google URI googleUri = new URI("http://www.google.com"); // Get an HttpRequest that uses HTTP 2.0 HttpRequest request = HttpRequest.newBuilder(googleUri).version(HttpClient.Version.HTTP_2).build(); // The client object contains HTTP version as 1.1 and the request // object contains HTTP version 2.0. The following statement will // send the request using HTTP 2.0, which is in the request object. HttpResponse<String> r = client.send(request, BodyHandler.asString());

    timeout()方法指定請求的超時時間。 如果在指定的超時時間內未收到響應,則會拋出HttpTimeoutException異常。

    HTTP請求可能包含名為expect的首部字段,其值為“100-Continue”。 如果設置了此首部字段,則客戶端只會向服務器發送頭文件,并且預計服務器將發回錯誤響應或100-Continue響應。 收到此響應后,客戶端將請求主體發送到服務器。 在客戶端發送實際請求體之前,客戶端使用此技術來檢查服務器是否可以基于請求的首部處理請求。 默認情況下,此首部字段未設置。 需要調用請求構建器的expectContinue(true)方法來啟用此功能。 請注意,調用請求構建器的header("expect", "100-Continue")方法不會啟用此功能。 必須使用expectContinue(true)方法啟用它。

    // Enable the expect=100-Continue header in the request HttpRequest.Builder builder = HttpRequest.newBuilder() .expectContinue(true);

    五. 設置請求首部

    HTTP請求中的首部(header)是鍵值對的形式。 可以有多個首部字段。 可以使用HttpRequest.Builder類的header(),headers()和setHeader()方法向請求添加首部字段。 如果header()和headers()方法尚未存在,則會添加首部字段。 如果首部字段已經添加,這些方法什么都不做。 setHeader()方法如果存在,將替換首部字段; 否則,它會添加首部字段。

    header()和setHeader()方法允許一次添加/設置一個首部字段,而headers()方法可以添加多個。headers()方法采用一個可變參數,它應該按順序包含鍵值對。 以下代碼片段顯示了如何為HTTP請求設置首部字段:

    // Create a URI URI calc = new URI("http://localhost:8080/webapp/Calculator"); // Use the header() method HttpRequest.Builder builder1 = HttpRequest.newBuilder(calc).header("Content-Type", "application/x-www-form-urlencoded").header("Accept", "text/plain"); // Use the headers() method HttpRequest.Builder builder2 = HttpRequest.newBuilder(calc) .headers("Content-Type", "application/x-www-form-urlencoded","Accept", "text/plain"); // Use the setHeader() method HttpRequest.Builder builder3 = HttpRequest.newBuilder(calc) .setHeader("Content-Type", "application/x-www-form-urlencoded").setHeader("Accept", "text/plain");

    六. 設置請求內容實體

    一些HTTP請求的主體包含使用POST和PUT方法的請求等數據。 使用主體處理器設置HTTP請求的內容實體,該體處理器是HttpRequest.BodyProcessor的靜態嵌套接口。

    HttpRequest.BodyProcessor接口包含以下靜態工廠方法,它們返回一個HTTP請求的處理器,請求特定類型的資源(例如String,byte []或File):

    HttpRequest.BodyProcessor fromByteArray(byte[] buf) HttpRequest.BodyProcessor fromByteArray(byte[] buf, int offset, int length) HttpRequest.BodyProcessor fromByteArrays(Iterable<byte[]> iter) HttpRequest.BodyProcessor fromFile(Path path) HttpRequest.BodyProcessor fromInputStream(Supplier<? extends InputStream> streamSupplier) HttpRequest.BodyProcessor fromString(String body) HttpRequest.BodyProcessor fromString(String s, Charset charset)

    這些方法的第一個參數表示請求的內容實體的數據源。 例如,如果String對象提供請求的內容實體,則使用fromString(String body)方法獲取一個處理器。

    Tips
    HttpRequest類包含noBody()靜態方法,該方法返回一個HttpRequest.BodyProcessor,它不處理請求內容實體。 通常,當HTTP方法不接受正文時,此方法可以與method()方法一起使用,但是method()方法需要傳遞一個實體處理器。

    一個請求是否可以擁有一個內容實體取決于用于發送請求的HTTP方法。 DELETE,POST和PUT方法都有一個實體,而GET方法則沒有。HttpRequest.Builder類包含一個與HTTP方法名稱相同的方法來設置請求的方法和實體。 例如,要使用POST方法與主體,構建器有POST(HttpRequest.BodyProcessor body)方法。

    還有許多其他HTTP方法,如HEAD和OPTIONS,它們沒有HttpRequest.Builder類的相應方法。 該類包含一個可用于任何HTTP方法的method(String method, HttpRequest.BodyProcessor body)。 當使用method()方法時,請確保以大寫的方式指定方法名稱,例如GET,POST,HEAD等。以下是這些方法的列表:

    HttpRequest.Builder DELETE(HttpRequest.BodyProcessor body) HttpRequest.Builder method(String method, HttpRequest.BodyProcessor body) HttpRequest.Builder POST(HttpRequest.BodyProcessor body) HttpRequest.Builder PUT(HttpRequest.BodyProcessor body)

    以下代碼片段從String中設置HTTP請求的內容實體,通常在將HTML表單發布到URL時完成。 表單數據由三個n1,n2和op字段組成。

    URI calc = new URI("http://localhost:8080/webapp/Calculator"); // Compose the form data with n1 = 10, n2 = 20. And op = + String formData = "n1=" + URLEncoder.encode("10","UTF-8") +"&n2=" + URLEncoder.encode("20","UTF-8") +"&op=" + URLEncoder.encode("+","UTF-8") ; HttpRequest.Builder builder = HttpRequest.newBuilder(calc) .header("Content-Type", "application/x-www-form-urlencoded").header("Accept", "text/plain").POST(HttpRequest.BodyProcessor.fromString(formData));

    七. 創建HTTP請求

    創建HTTP請求只需調用HttpRequest.Builder上的build()方法,該方法返回一個HttpRequest對象。 以下代碼段創建了使用HTTP GET方法的HttpRequest:

    HttpRequest request = HttpRequest.newBuilder().uri(new URI("http://www.google.com")).GET().build();

    以下代碼片段使用HTTP POST方法構建首部信息和內容實體的Http請求:

    // Build the URI and the form’s data URI calc = new URI("http://localhost:8080/webapp/Calculator"); String formData = "n1=" + URLEncoder.encode("10","UTF-8") +"&n2=" + URLEncoder.encode("20","UTF-8") +"&op=" + URLEncoder.encode("+","UTF-8"); // Build the HttpRequest object HttpRequest request = HttpRequest.newBuilder(calc) .header("Content-Type", "application/x-www-form-urlencoded").header("Accept", "text/plain") .POST(HttpRequest.BodyProcessor.fromString(formData)).build();

    請注意,創建HttpRequest對象不會將請求發送到服務器。 需要調用HttpClient類的send()或sendAsync()方法將請求發送到服務器。

    以下代碼片段使用HTTP HEAD請求方法創建一個HttpRequest對象。 請注意,它使用HttpRequest.Builder類的method()方法來指定HTTP方法。

    HttpRequest request =HttpRequest.newBuilder(new URI("http://www.google.com")) .method("HEAD", HttpRequest.noBody()).build();

    八. 處理HTTP響應

    一旦擁有HttpRequest對象,可以將請求發送到服務器并同步或異步地接收響應。 HttpResponse<T>類的實例表示從服務器接收到的響應,其中類型參數T表示響應內容實體的類型,例如String,byte []或Path。 可以使用HttpRequest類的以下方法發送HTTP請求并接收HTTP響應:

    <T> HttpResponse<T> send(HttpRequest req, HttpResponse.BodyHandler<T> responseBodyHandler) <T> CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest req, HttpResponse.BodyHandler<T> responseBodyHandler) <U,T> CompletableFuture<U> sendAsync(HttpRequest req, HttpResponse.MultiProcessor<U,T> multiProcessor)

    send()方法是同步的。 也就是說,它會一直阻塞,直到收到響應。 sendAsync()方法異步處理響應。 它立即返回一個CompletableFuture<HttpResponse>,當響應準備好進行處理時,它就會完成。

    1. 處理響應狀態和首部

    HTTP響應包含狀態代碼,響應首部和響應內容實體。 一旦從服務器接收到狀態代碼和首部,但在接收到正文之前,HttpResponse對象就可使用。 HttpResponse類的statusCode()方法返回響應的狀態代碼,類型為int。 HttpResponse類的headers()方法返回響應的首部,作為HttpHeaders接口的實例。 HttpHeaders接口包含以下方法,通過名稱或所有首部方便地檢索首部的值作為Map <String,List <String >>類型:

    List<String> allValues(String name) Optional<String> firstValue(String name) Optional<Long> firstValueAsLong(String name) Map<String,List<String>> map()

    下面包含一個完整的程序,用于向google發送請求,并附上HEAD請求。 它打印接收到的響應的狀態代碼和首部。 你可能得到不同的輸出。

    // GoogleHeadersTest.java package com.jdojo.http.client; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import jdk.incubator.http.HttpClient; import jdk.incubator.http.HttpRequest; import jdk.incubator.http.HttpResponse; public class GoogleHeadersTest {public static void main(String[] args) {try {URI googleUri = new URI("http://www.google.com");HttpClient client = HttpClient.newHttpClient();HttpRequest request =HttpRequest.newBuilder(googleUri).method("HEAD", HttpRequest.noBody()).build();HttpResponse<?> response =client.send(request, HttpResponse.BodyHandler.discard(null));// Print the response status code and headersSystem.out.println("Response Status Code:" +response.statusCode());System.out.println("Response Headers are:");response.headers().map().entrySet().forEach(System.out::println);} catch (URISyntaxException | InterruptedException |IOException e) {e.printStackTrace();}} }

    輸出的結果為:

    WARNING: Using incubator modules: jdk.incubator.httpclient Response Status Code:200 Response Headers are: accept-ranges=[none] cache-control=[private, max-age=0] content-type=[text/html; charset=ISO-8859-1] date=[Sun, 26 Feb 2017 16:39:36 GMT] expires=[-1] p3p=[CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."] server=[gws] set-cookie=[NID=97=Kmz52m8Zdf4lsNDsnMyrJomx_2kD7lnWYcNEuwPWsFTFUZ7yli6DbCB98Wv-SlxOfKA0OoOBIBgysuZw3ALtgJjX67v7-mC5fPv88n8VpwxrNcjVGCfFrxVro6gRNIrye4dAWZvUVfY28eOM; expires=Mon, 28-Aug-2017 16:39:36 GMT; path=/; domain=.google.com; HttpOnly] transfer-encoding=[chunked] vary=[Accept-Encoding] x-frame-options=[SAMEORIGIN] x-xss-protection=[1; mode=block]

    2. 處理響應內容實體

    處理HTTP響應的內容實體是兩步過程:

    • 當使用HttpClient類的send()或sendAsync()方法發送請求時,需要指定響應主體處理程序,它是HttpResponse.BodyHandler<T>接口的實例。
    • 當接收到響應狀態代碼和首部時,調用響應體處理程序的apply()方法。 響應狀態代碼和首部傳遞給apply()方法。 apply()方法返回HttpResponse.BodyProcessor接口的實例,它讀取響應實體并將讀取的數據轉換為類型T。

    不要擔心處理響應實體的這些細節。 提供了HttpResponse.BodyHandler<T>的幾個實現。 可以使用HttpResponse.BodyHandler接口的以下靜態工廠方法獲取其不同類型參數T的實例:

    HttpResponse.BodyHandler<byte[]> asByteArray() HttpResponse.BodyHandler<Void> asByteArrayConsumer(Consumer<Optional<byte[]>> consumer) HttpResponse.BodyHandler<Path> asFile(Path file) HttpResponse.BodyHandler<Path> asFile(Path file, OpenOption... openOptions) HttpResponse.BodyHandler<Path> asFileDownload(Path directory, OpenOption... openOptions) HttpResponse.BodyHandler<String> asString() HttpResponse.BodyHandler<String> asString(Charset charset) <U> HttpResponse.BodyHandler<U> discard(U value)

    這些方法的簽名足夠直觀,可以告訴你他們處理什么類型的響應實體。 例如,如果要將響應實體作為String獲取,請使用asString()方法獲取一個實體處理程序。 discard(U value)方法返回一個實體處理程序,它丟棄響應實體并返回指定的值作為主體。

    HttpResponse<T>類的body()方法返回類型為T的響應實體。

    以下代碼段向google發送GET請求,并以String形式檢索響應實體。 這里忽略了了異常處理邏輯。

    import java.net.URI; import jdk.incubator.http.HttpClient; import jdk.incubator.http.HttpRequest; import jdk.incubator.http.HttpResponse; import static jdk.incubator.http.HttpResponse.BodyHandler.asString; ... // Build the request HttpRequest request = HttpRequest.newBuilder().uri(new URI("http://google.com")).GET().build(); // Send the request and get a Response HttpResponse<String> response = HttpClient.newHttpClient().send(request, asString()); // Get the response body and print it String body = response.body(); System.out.println(body);

    輸出結果為:

    WARNING: Using incubator modules: jdk.incubator.httpclient <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.com/">here</A>. </BODY></HTML>

    該示例返回一個狀態代碼為301的響應正文,表示URL已經移動。 輸出還包含移動的URL。 如果將HttpClient中的以下重定向策略設置為“ALWAYS”,則該請求將重新提交到已移動的URL。 以下代碼片段可解決此問題:

    // The request will follow the redirects issues by the server HttpResponse<String> response = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build().send(request, asString());

    下面包含一個完整的程序,它顯示如何使用一個POST請求與內容實體,并異步處理響應。 源代碼中的Web應用程序包含為Calculator的servlet。 Calculator servlet的源代碼不會在這里顯示。 servlet接受請求中的三個參數,命名為n1,n2和op,其中n1和n2是兩個數字,op是一個運算符(+, - ,*或/)。 響應是一個純文本,并包含了運算符及其結果。 程序中的URL假定你已在本機上部署了servlet,并且Web服務器正在端口8080上運行。如果這些假設不正確,請相應地修改程序。 如果servlet被成功調用,你將得到這里顯示的輸出。 否則,將獲得不同的輸出。

    // CalculatorTest.java package com.jdojo.http.client; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; import jdk.incubator.http.HttpClient; import jdk.incubator.http.HttpRequest; import static jdk.incubator.http.HttpRequest.BodyProcessor.fromString; import jdk.incubator.http.HttpResponse; public class CalculatorTest {public static void main(String[] args) {try {URI calcUri =new URI("http://localhost:8080/webapp/Calculator");String formData = "n1=" + URLEncoder.encode("10","UTF-8") +"&n2=" + URLEncoder.encode("20","UTF-8") +"&op=" + URLEncoder.encode("+","UTF-8") ;// Create a requestHttpRequest request = HttpRequest.newBuilder().uri(calcUri).header("Content-Type", "application/x-www-form-urlencoded").header("Accept", "text/plain") .POST(fromString(formData)).build();// Process the response asynchronously. When the response// is ready, the processResponse() method of this class will// be called.HttpClient.newHttpClient().sendAsync(request,HttpResponse.BodyHandler.asString()).whenComplete(CalculatorTest::processResponse);try {// Let the current thread sleep for 5 seconds,// so the async response processing is completeThread.sleep(5000);} catch (InterruptedException ex) {ex.printStackTrace();}} catch (URISyntaxException | IOException e) {e.printStackTrace();}}private static void processResponse(HttpResponse<String> response,Throwable t) {if (t == null ) {System.out.println("Response Status Code: " + response.statusCode());System.out.println("Response Body: " + response.body());} else {System.out.println("An exception occurred while " +"processing the HTTP request. Error: " + t.getMessage());}} }

    輸出結果為:

    WARNING: Using incubator modules: jdk.incubator.httpclient Response Status Code: 200 Response Body: 10 + 20 = 30.0

    使用響應實體處理程序可以節省開發人員的大量工作。 在一個語句中,可以下載并將URL的內容保存在文件中。 以下代碼片段將google的內容作為google.html的文件保存在當前目錄中。 下載完成后,打印下載文件的路徑。 如果發生錯誤,則會打印異常的堆棧跟蹤。

    HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build().sendAsync(HttpRequest.newBuilder() .uri(new URI("http://www.google.com")).GET().build(),asFile(Paths.get("google.html"))).whenComplete((HttpResponse<Path> response,Throwable exception) -> {if(exception == null) {System.out.println("File saved to " +response.body().toAbsolutePath());} else {exception.printStackTrace();}});

    3. 處理響應的Trailer

    HTTP Trailer是HTTP響應結束后由服務器發送的鍵值列表。 許多服務器通常不使用HTTP Trailer。 HttpResponse類包含一個trailers()方法,它作為CompletableFuture <HttpHeaders>的實例返回響應Trailer。 注意返回的對象類型的名稱——HttpHeaders。 HTTP/2 Client API確實有一個名為HttpTrailers的類型。 需要檢索響應實體,然后才能檢索Trailer。 目前,HTTP/2 Client API不支持處理HTTP Trailer了。 以下代碼片段顯示了如何在API支持時打印所有響應Trailer:

    // Get an HTTP response HttpResponse<String> response = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build().send(HttpRequest.newBuilder() .uri(new URI("http://www.google.com")).GET().build(),asString()); // Read the response body String body = response.body(); // Process trailers response.trailers().whenComplete((HttpHeaders trailers, Throwable t) -> {if(t == null) {trailers.map().entrySet().forEach(System.out::println);} else {t.printStackTrace();}});

    九. 設置請求重定向策略

    一個HTTP請求對應的響應,Web服務器可以返回3XX響應狀態碼,其中X是0到9之間的數字。該狀態碼表示客戶端需要執行附加操作才能完成請求。 例如,狀態代碼為301表示URL已被永久移動到新位置。 響應實體包含替代位置。 默認情況下,在收到3XX狀態代碼后,請求不會重新提交到新位置。 可以將HttpClient.Redirect枚舉的以下常量設置為HttpClient執行的策略,以防返回的響應包含3XX響應狀態代碼:

    • ALWAYS
    • NEVER
    • SAME_PROTOCOL
    • SECURE

    ALWAYS指示應始終遵循重定向。 也就是說,請求應該重新提交到新的位置。

    NEVER表示重定向不應該被遵循。 這是默認值。

    SAME_PROTOCOL表示如果舊位置和新位置使用相同的協議(例如HTTP到HTTP或HTTPS到HTTPS),則可能會發生重定向。

    SECURE表示重定向應始終發生,除非舊位置使用HTTPS,而新的位置使用了HTTP。

    十. 使用WebSocket協議

    WebSocket協議在兩個endpoint(客戶端endpoint和服務器endpoint)之間提供雙向通信。 endpoint 是指使用WebSocket協議的連接的兩側中的任何一個。 客戶端endpoint啟動連接,服務器端點接受連接。 連接是雙向的,這意味著服務器endpoint可以自己將消息推送到客戶端端點。 在這種情況下,也會遇到另一個術語,稱為對等體(peer)。 對等體只是連接的另一端。 例如,對于客戶端endpoint,服務器endpoint是對等體,對于服務器endpoint,客戶端endpoint是對等體。 WebSocket會話表示endpoint和單個對等體之間的一系列交互。

    WebSocket協議可以分為三個部分:

    • 打開握手
    • 數據交換
    • 關閉握手

    客戶端發起與與服務器的打開握手。 使用HTTP與WebSocket協議的升級請求進行握手。 服務器通過升級響應響應打開握手。 握手成功后,客戶端和服務器交換消息。 消息交換可以由客戶端或服務器發起。 最后,任一endpoint都可以發送關閉握手; 對方以關閉握手回應。 關閉握手成功后,WebSocket關閉。

    JDK 9中的HTTP/2 Client API支持創建WebSocket客戶端endpoint。 要擁有使用WebSocket協議的完整示例,需要具有服務器endpoint和客戶端endpoint。 以下部分涵蓋了創建兩者。

    1. 創建服務器端Endpoint

    創建服務器Endpoint需要使用Java EE。 將簡要介紹如何創建一個服務器Endpoint示例中使用。 使用Java EE 7注解創建一個WebSocket服務器Endpoint。

    下面包含TimeServerEndPoint類的代碼。 該類包含在源代碼的webapp目錄中的Web應用程序中。 將Web應用程序部署到Web服務器時,此類將部署為服務器Endpoint。

    // TimeServerEndPoint.java package com.jdojo.ws; import java.io.IOException; import java.time.ZonedDateTime; import java.util.concurrent.TimeUnit; import javax.websocket.CloseReason; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import static javax.websocket.CloseReason.CloseCodes.NORMAL_CLOSURE; @ServerEndpoint("/servertime") public class TimeServerEndPoint {@OnOpenpublic void onOpen(Session session) { System.out.println("Client connected. ");}@OnClosepublic void onClose(Session session) { System.out.println("Connection closed.");}@OnErrorpublic void onError(Session session, Throwable t) {System.out.println("Error occurred:" + t.getMessage());}@OnMessagepublic void onMessage(String message, Session session) {System.out.println("Client: " + message); // Send messages to the clientsendMessages(session);}private void sendMessages(Session session) {/* Start a new thread and send 3 messages to theclient. Each message contains the current date andtime with zone.*/new Thread(() -> {for(int i = 0; i < 3; i++) {String currentTime =ZonedDateTime.now().toString();try {session.getBasicRemote().sendText(currentTime, true);TimeUnit.SECONDS.sleep(5);} catch(InterruptedException | IOException e) {e.printStackTrace();break;}}try {// Let us close the WebSocketsession.close(new CloseReason(NORMAL_CLOSURE,"Done"));} catch (IOException e) {e.printStackTrace();}}).start();} }

    在TimeServerEndPoint類上使用@ServerEndpoint("/servertime")注解使該類成為服務器Endpoint,當它部署到Web服務器時。注解value元素的值為/servertime,這將使Web服務器在此URL發布此Endpoint。

    該類包含四個方法,它們已經添加了@onOpen,@onMessage,@onClose和@onError注解。 命名這些方法的名字與這些注解相同。 這些方法在服務器Endpoint的生命周期的不同點被調用。 他們以Session對象為參數。 Session對象表示此Endpoint與其對等體的交互,這將是客戶端。

    當與對等體進行握手成功時,將調用onOpen()方法。 該方法打印客戶端連接的消息。

    當從對等體接收到消息時,會調用onMessage()。 該方法打印它接收的消息,并調用一個名為sendMessages()的私有方法。 sendMessages()方法啟動一個新線程,并向對等體發送三條消息。 線程在發送每條消息后休眠五秒鐘。 該消息包含當前日期和時間與時區。 可以同步或異步地向對等體發送消息。 要發送消息,需要獲得表示與對等體的會話的RemoteEndpoint接口的引用。 在Session實例上使用getBasicRemote()和getAsyncRemote()方法來獲取可以分別同步和異步發送消息的RemoteEndpoint.Basic和RemoteEndpont.Async實例。 一旦得到了對等體(遠程endpoint)的引用,可以調用其幾個sendXxx()方法來向對等體發送不同類型的數據。

    // Send a synchronous text message to the peer session.getBasicRemote().sendText(currentTime, true);

    sendText()方法中的第二個參數指示是否是發送的部分消息的最后一部分。 如果消息完成,請使用true。

    在所有消息發送到對等體后,使用sendClose()方法發送關閉消息。 該方法接收封閉了一個關閉代碼和一個緊密原因的CloseReason類的對象。 當對等體收到一個關閉消息時,對等體需要響應一個關閉消息,之后WebSocket連接被關閉。

    請注意,在發送關閉消息后,服務器endpoint不應該向對等體發送更多消息。

    當出現錯誤而不是由WebSocket協議處理時,會調用onError()方法。

    不能單獨使用此endpoint。 需要創建一個客戶端endpoint,將在下一節中詳細介紹。

    2. 創建客戶端Endpoint

    開發WebSocket客戶端Endpoint涉及使用WebSocket接口,它是JDK 9中的HTTP/2 Client API的一部分。WebSocket接口包含以下嵌套類型:

    • WebSocket.Builder
    • WebSocket.Listener
    • WebSocket.MessagePart

    WebSocket接口的實例表示一個WebSocket客戶端endpoint。 構建器,它是WebSocket.Builder接口的實例,用于創建WebSocket實例。 HttpClient類的newWebSocketBuilder(URI uri, WebSocket.Listener listener)方法返回一個WebSocket.Builder接口的實例。

    當事件發生在客戶端endpoint時,例如,完成開啟握手,消息到達,關閉握手等,通知被發送到一個監聽器,該監聽器是WebSocket.Listener接口的實例。 該接口包含每種通知類型的默認方法。 需要創建一個實現此接口的類。 僅實現與接收通知的事件相對應的那些方法。 創建·WebSocket·實例時,需要指定監聽器。

    當向對等體發送關閉消息時,可以指定關閉狀態代碼。 WebSocket接口包含以下可以用作WebSocket關閉消息狀態代碼的int類型常量:

    • CLOSED_ABNORMALLY:表示WebSocket關閉消息狀態代碼(1006),這意味著連接異常關閉,例如,沒有發送或接收到關閉消息。
    • NORMAL_CLOSURE:表示WebSocket關閉消息狀態代碼(1000),這意味著連接正常關閉。 這意味著建立連接的目的已經實現了。

    服務器Endpoint可能會發送部分消息。 消息被標記為開始,部分,最后或全部,表示其位置。 WebSocket.MessagePart枚舉定義了與消息的位置相對應的四個常量:FIRST,PART,LAST和WHOLE。 當監聽器收到已收到消息的通知時,將這些值作為消息的一部分。

    以下部分將詳細介紹設置客戶端Endpoint的各個步驟。

    十一. 創建監聽器

    監聽器是WebSocket.Listener接口的實例。 創建監聽器涉及創建實現此接口的類。 該接口包含以下默認方法:

    CompletionStage<?> onBinary(WebSocket webSocket, ByteBuffer message, WebSocket.MessagePart part) CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason) void onError(WebSocket webSocket, Throwable error) void onOpen(WebSocket webSocket) CompletionStage<?> onPing(WebSocket webSocket, ByteBuffer message) CompletionStage<?> onPong(WebSocket webSocket, ByteBuffer message) CompletionStage<?> onText(WebSocket webSocket, CharSequence message, WebSocket.MessagePart part)

    當客戶端Endpoint連接到引用傳遞給該方法的對等體作為第一個參數時,調用onOpen()方法。 默認實現請求一個消息,這意味著該偵聽器可以再接收一條消息。 消息請求是使用WebSocket接口的request(long n)方法進行的:

    // Allow one more message to be received webSocket.request(1);

    如果服務器發送的消息多于請求消息,則消息在TCP連接上排隊,最終可能強制發送方通過TCP流控制停止發送更多消息。 請在適當的時間調用request(long n)方法并使用適當的參數值,這樣監聽器就不會從服務器一直接收消息。 在監聽器中重寫onOpen()方法是一個常見的錯誤,而不是調用webSocket.request(1)方法,后者會阻止從服務器接收消息。

    當endpoint收到來自對等體的關閉消息時,調用onClose()方法。 這是監聽器的最后通知。 從此方法拋出的異常將被忽略。 默認的實現不會做任何事情。 通常,需要向對方發送一條關閉消息,以完成關閉握手。

    當endpoint從對等體接收到Ping消息時,調用onPing()方法。 Ping消息可以由客戶端和服務器endpoint發送。 默認實現將相同消息內容的Pong消息發送給對等體。

    當endpoint從對等體接收到Pong消息時,調用onPong()方法。 通常作為對先前發送的Ping消息的響應來接收Pong消息。 endpoint也可以接收未經請求的Pong消息。 onPong()方法的默認實現在監聽器上再請求一個消息,不執行其他操作。

    當WebSocket上發生I/O或協議錯誤時,會調用onError()方法。 從此方法拋出的異常將被忽略。 調用此方法后,監聽器不再收到通知。 默認實現什么都不做。

    當從對等體接收到二進制消息和文本消息時,會調用onBinary()和onText()方法。 確保檢查這些方法的最后一個參數,這表示消息的位置。 如果收到部分消息,需要組裝它們以獲取整個消息。 從這些方法返回null表示消息處理完成。 否則,返回CompletionStage<?>,并在消息處理完成后完成。

    以下代碼段創建一個可以接收信息的WebSocket監聽器:

    WebSocket.Listener listener = new WebSocket.Listener() {@Overridepublic CompletionStage<?> onText(WebSocket webSocket,CharSequence message,WebSocket.MessagePart part) {// Allow one message to be received by the listenerwebSocket.request(1);// Print the message received from the serverSystem.out.println("Server: " + message);// Return null indicating that we are done processing this messagereturn null;} };

    十二. 構建Endpoint

    需要構建充當客戶端點的WebSocket接口的實例。 該實例用于與服務器Endpoint連接和交換消息。 WebSocket實例使用WebSocket.Builder構建。 可以使用HttpClient類的以下方法獲取構建器:

    WebSocket.Builder newWebSocketBuilder(URI uri, WebSocket.Listener listener)

    用于獲取WebSocket構建器的HttpClient實例提供了WebSocket的連接配置。 指定的uri是服務器Endpoint的URI。 監聽器是正在構建的Endpoint的監聽器, 擁有構建器后,可以調用以下方法來配置endpoint:

    WebSocket.Builder connectTimeout(Duration timeout) WebSocket.Builder header(String name, String value) WebSocket.Builder subprotocols(String mostPreferred, String... lesserPreferred)

    connectTimeout()方法允許指定開啟握手的超時時間。 如果開放握手在指定的持續時間內未完成,則從WebSocket.Builder的buildAsync()方法完成后返回帶有異常的HttpTimeoutException的CompletableFuture。 可以使用header()方法添加任何用于打開握手的自定義首部。 可以使用subprotocols()方法在打開握手期間指定給定子協議的請求 —— 只有其中一個將被服務器選擇。 子協議由應用程序定義。 客戶端和服務器需要同意處理特定的子協議及其細節。

    最后,調用WebSocket.Builder接口的buildAsync()方法來構建Endpoint。 它返回CompletableFuture <WebSocket>,當該Endpoint連接到服務器Endpoint時,正常完成; 當有錯誤時,返回異常。 以下代碼片段顯示了如何構建和連接客戶端Endpoint。 請注意,服務器的URI以ws開頭,表示WebSocket協議。

    URI serverUri = new URI("ws://localhost:8080/webapp/servertime"); // Get a listener WebSocket.Listener listener = ...; // Build an endpoint using the default HttpClient HttpClient.newHttpClient().newWebSocketBuilder(serverUri, listener).buildAsync().whenComplete((WebSocket webSocket, Throwable t) -> {// More code goes here});

    十三. 向對等體發送消息

    一旦客戶端Endpoint連接到對等體,則交換消息。 WebSocket接口的實例表示一個客戶端Endpoint,該接口包含以下方法向對等體發送消息:

    CompletableFuture<WebSocket> sendBinary(ByteBuffer message, boolean isLast) CompletableFuture<WebSocket> sendClose() CompletableFuture<WebSocket> sendClose(int statusCode, String reason) CompletableFuture<WebSocket> sendPing(ByteBuffer message) CompletableFuture<WebSocket> sendPong(ByteBuffer message) CompletableFuture<WebSocket> sendText(CharSequence message) CompletableFuture<WebSocket> sendText(CharSequence message, boolean isLast)

    sendText()方法用于向對等體發送信息。 如果發送部分消息,請使用該方法的兩個參數的版本。 如果第二個參數為false,則表示部分消息的一部分。 如果第二個參數為true,則表示部分消息的最后部分。 如果以前沒有發送部分消息,則第二個參數中的true表示整個消息。

    endText(CharSequence message)是一種便捷的方法,它使用true作為第二個參數來調用該方法的第二個版本。

    sendBinary()方法向對等體發送二進制信息。

    sendPing()和sendPong()方法分別向對等體發送Ping和Pong消息。

    sendClose()方法向對等體發送Close消息。 可以發送關閉消息作為由對等方發起的關閉握手的一部分,或者可以發送它來發起與對等體的閉合握手。

    Tips
    如果想要突然關閉WebSocket,請使用WebSocket接口的abort()方法。

    1. 運行WebSocket程序

    現在是查看WebSocket客戶端endpoint和WebSocket服務器endpoint交換消息的時候了。下面包含一個封裝客戶機endpoint的WebSocketClient類的代碼。 其用途如下:

    // Create a client WebSocket WebSocketClient wsClient = new WebSocketClient(new URI(“<server-uri>”)); // Connect to the server and exchange messages wsClient.connect(); // WebSocketClient.java package com.jdojo.http.client; import java.net.URI; import java.util.concurrent.CompletionStage; import jdk.incubator.http.HttpClient; import jdk.incubator.http.WebSocket; public class WebSocketClient {private WebSocket webSocket;private final URI serverUri;private boolean inError = false;public WebSocketClient(URI serverUri) {this.serverUri = serverUri;}public boolean isClosed() {return (webSocket != null && webSocket.isClosed())||this.inError; }public void connect() {HttpClient.newHttpClient().newWebSocketBuilder(serverUri, this.getListener()).buildAsync().whenComplete(this::statusChanged);}private void statusChanged(WebSocket webSocket, Throwable t) {this.webSocket = webSocket;if (t == null) { this.talkToServer();} else {this.inError = true;System.out.println("Could not connect to the server." +" Error: " + t.getMessage());}}private void talkToServer() {// Allow one message to be received by the listenerwebSocket.request(1);// Send the server a request for timewebSocket.sendText("Hello");}private WebSocket.Listener getListener() {return new WebSocket.Listener() {@Overridepublic void onOpen(WebSocket webSocket) {// Allow one more message to be received by the listenerwebSocket.request(1);// Notify the user that we are connectedSystem.out.println("A WebSocket has been opened."); }@Overridepublic CompletionStage<?> onClose(WebSocket webSocket,int statusCode, String reason) {// Server closed the web socket. Let us respond to// the close message from the serverwebSocket.sendClose();System.out.println("The WebSocket is closed." +" Close Code: " + statusCode +", Close Reason: " + reason);// Return null indicating that this WebSocket// can be closed immediatelyreturn null;}@Overridepublic void onError(WebSocket webSocket, Throwable t) {System.out.println("An error occurred: " + t.getMessage());}@Overridepublic CompletionStage<?> onText(WebSocket WebSocket,CharSequence message, WebSocket.MessagePart part) {// Allow one more message to be received by the listenerwebSocket.request(1);// Print the message received from the serverSystem.out.println("Server: " + message);// Return null indicating that we are done// processing this messagereturn null;}};} }

    WebSocketClient類的工作原理如下:

    • webSocket實例變量保存客戶端endpoint的引用。
    • serverUri實例變量保存服務器端endpoint的URI。
    • isError實例變量保存一個指示符,無論該endpoint 是否出錯。
    • isClosed()方法檢查endpoint 是否已經關閉或出錯。
    • 在開啟握手成功之前,webSocket實例變量置為null。 它的值在statusChanged()方法中更新。
    • connect()方法構建一個WebSocket并啟動一個開始握手。 請注意,無論連接狀態如何,它在開始握手完成后調用statusChanged()方法。
    • 當開始握手成功時,tatusChanged()方法通過調用talkToServer()方法與服務器通信。 否則,它會打印一條錯誤消息,并將isError標志設置為true。
    • talkToServer()方法允許監聽器再接收一個消息,并向服務器endpoint發送一條信息。 請注意,服務器endpoint從客戶端endpoint接收到信息時,會以五秒的間隔發送三個消息。 從talkToServer()方法發送此消息將啟動兩個endpoint之間的消息交換。
    • getListener()方法創建并返回一個WebSocket.Listener實例。 服務器endpoint將發送三個消息,后跟一個關閉消息。 監聽器中的onClose()方法通過發送一個空的關閉消息來響應來自服務器的關閉消息,這將結束客戶端endpoint操作。

    如下包含運行客戶端endpoint的程序。 如果運行WebSocketClientTest類,請確保具有服務器endpoint的Web應用程序正在運行。 還需要修改SERVER_URI靜態變量以匹配Web應用程序的服務器endpoint的URI。 輸出將使用時區打印當前日期和時間,因此可能會得到不同的輸出。

    // WebSocketClientTest.java package com.jdojo.http.client; import java.net.URI; import java.net.URISyntaxException; import java.util.concurrent.TimeUnit; public class WebSocketClientTest { // Please change the URI to point to your server endpointstatic final String SERVER_URI ="ws://localhost:8080/webapp/servertime";public static void main(String[] args)throws URISyntaxException, InterruptedException {// Create a client WebSocketWebSocketClient wsClient = new WebSocketClient(new URI(SERVER_URI));// Connect to the ServerwsClient.connect();// Wait until the WebSocket is closedwhile(!wsClient.isClosed()) { TimeUnit.SECONDS.sleep(1);}// Need to exitSystem.exit(0);} }

    輸出結果為:

    A WebSocket has been opened. Server: 2016-12-15T14:19:53.311-06:00[America/Chicago] Server: 2016-12-15T14:19:58.312-06:00[America/Chicago] Server: 2016-12-15T14:20:03.313-06:00[America/Chicago] The WebSocket is closed. Close Code: 1000, Close Reason: Done

    2. WebSocket應用程序疑難解答

    當測試WebSocket應用程序時,會出現一些問題。 下表列出了一些這些問題及其解決方案。

    錯誤信息解決方案
    Could not connect to the server. Error: java.net.ConnectException: Connection refused: no further information表示Web服務器未運行或服務器URI不正確。 嘗試運行Web服務器并檢查在WebSocketClientTest類中其SERVER_URI靜態變量的指定的服務器URI。
    Could not connect to the server. Error: java.net.http.WebSocketHandshakeException: 404: RFC 6455 1.3. Unable to complete handshake; HTTP response status code 404表示服務器URI未指向服務器上的正確endpoint 。 驗證WebSocketClientTest類中SERVER_URI靜態變量的值是否正確。
    A WebSocket has been opened. Dec 15, 2016 2:58:03 PM java.net.http.WS$1 onError WARNING: Failing connection java.net.http.WS@162532d6[CONNECTED], reason: 'RFC 6455 7.2.1. Stream ended before a Close frame has been received' An error occurred: null表示開啟握手后,服務器將自動關閉服務器endpoint。 這通常由計算機上運行的防病毒程序執行的。 需要配置防病毒程序以允許指定端口上的HTTP連接,或者在另一個未被防病毒程序阻止的端口上使用HTTP監聽器運行Web服務器。
    A WebSocket has been opened. Server: 2016-12-16T07:15:04.586-06:00[America/Chicago]在這種情況下,應用程序會打印一行或兩行輸出并一直等待。 當在客戶端endpoint邏輯中沒有webSocket.request(1)調用時,會發生這種情況。 服務器正在發送消息,因為不允許更多消息排隊。 在onOpen,onText和其他事件中調用request(n)方法來解決這個問題。

    十四. 總結

    JDK 9添加了一個HTTP/2 Client API,可以在Java應用程序中使用HTTP請求和響應。 API提供類和接口來開發具有身份驗證和TLS的WebSocket客戶端。 API位于jdk.incubator.http包中,該包位于jdk.incubator.httpclient模塊中。

    三個抽象類,HttpClient,HttpRequest和HttpResponse,WebSocket接口是HTTP/2 Client API的核心。這些類型的實例使用構建器創建。 HttpClient類是不可變的。HttpClient類的實例保存可以重復用于多個HTTP請求的HTTP連接配置。 HttpRequest類實例表示HTTP請求。 HttpResponse類的實例表示從服務器接收的HTTP響應。可以同步或異步地發送和接收HTTP請求和響應。

    WebSocket接口的實例表示一個WebSocket客戶端endpoint。與WebSocket服務器端endpoint的通信是異步完成的。 WebSocket API是基于事件的。需要為WebSocket客戶端endpoint指定一個監聽器,它是WebSocket.Listener接口的一個實例。監聽器通過調用其適當的方法 —— 當事件發生在endpoint上時,例如,當通過調用監聽器的onOpen()方法成功完成與對等體的打開握手時,通知監聽器。 API支持與對等體交換文本以及二進制消息。消息可以部分交換。

    轉載于:https://www.cnblogs.com/IcanFixIt/p/7229611.html

    總結

    以上是生活随笔為你收集整理的Java 9 揭秘(14. HTTP/2 Client API)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产精品亚洲lv粉色 | 国产网红无码精品视频 | 久久成人a毛片免费观看网站 | 人妻少妇精品无码专区动漫 | 亚洲春色在线视频 | 久久精品国产99久久6动漫 | 国产熟妇高潮叫床视频播放 | 啦啦啦www在线观看免费视频 | 国产精品久久久久无码av色戒 | 国产午夜亚洲精品不卡 | 久久久久成人精品免费播放动漫 | 黑森林福利视频导航 | 国产热a欧美热a在线视频 | 日韩av激情在线观看 | 日本欧美一区二区三区乱码 | 日本一本二本三区免费 | 亚洲s码欧洲m码国产av | 狠狠cao日日穞夜夜穞av | 国内少妇偷人精品视频免费 | 男人的天堂av网站 | 久久久久免费精品国产 | 又湿又紧又大又爽a视频国产 | 亚洲 高清 成人 动漫 | 国内精品人妻无码久久久影院 | 亚洲色成人中文字幕网站 | 免费播放一区二区三区 | 人人妻人人澡人人爽欧美一区九九 | 丝袜 中出 制服 人妻 美腿 | 天堂亚洲2017在线观看 | 白嫩日本少妇做爰 | 亚洲国产成人a精品不卡在线 | 成人精品一区二区三区中文字幕 | 欧美一区二区三区视频在线观看 | 无码人妻少妇伦在线电影 | 日本欧美一区二区三区乱码 | 亚洲成a人片在线观看无码 | 欧美日韩亚洲国产精品 | 日韩少妇内射免费播放 | 国产精品毛片一区二区 | 亚洲精品无码人妻无码 | 亚洲一区av无码专区在线观看 | 偷窥日本少妇撒尿chinese | 最近中文2019字幕第二页 | 在线观看欧美一区二区三区 | 亚洲中文字幕在线观看 | 精品国产乱码久久久久乱码 | 久久精品国产一区二区三区肥胖 | 高中生自慰www网站 | 天天综合网天天综合色 | 色婷婷香蕉在线一区二区 | 亚洲日本va中文字幕 | 一区二区三区乱码在线 | 欧洲 | 九九久久精品国产免费看小说 | 国产人妻人伦精品 | 日本va欧美va欧美va精品 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲色www成人永久网址 | 300部国产真实乱 | 亚洲伊人久久精品影院 | 东京热无码av男人的天堂 | 熟妇人妻无乱码中文字幕 | 在线成人www免费观看视频 | 中文字幕 亚洲精品 第1页 | 国产热a欧美热a在线视频 | 精品久久综合1区2区3区激情 | 无码一区二区三区在线 | 欧美人与牲动交xxxx | 小泽玛莉亚一区二区视频在线 | 少妇无码一区二区二三区 | 日本乱偷人妻中文字幕 | 狂野欧美性猛交免费视频 | 国产乱码精品一品二品 | 亚洲日韩av一区二区三区四区 | 日本在线高清不卡免费播放 | 夜精品a片一区二区三区无码白浆 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 天堂久久天堂av色综合 | 成年美女黄网站色大免费全看 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲人成网站免费播放 | 一本大道久久东京热无码av | a片免费视频在线观看 | 亚洲综合精品香蕉久久网 | 国产成人综合色在线观看网站 | 正在播放老肥熟妇露脸 | 国产精品va在线观看无码 | 一区二区三区乱码在线 | 欧洲 | 国产成人综合美国十次 | 欧美国产亚洲日韩在线二区 | 宝宝好涨水快流出来免费视频 | 四十如虎的丰满熟妇啪啪 | 亚洲精品久久久久久一区二区 | 人妻aⅴ无码一区二区三区 | ass日本丰满熟妇pics | 色窝窝无码一区二区三区色欲 | 国产av一区二区三区最新精品 | 亚洲中文无码av永久不收费 | 亚洲精品鲁一鲁一区二区三区 | 亚洲日韩中文字幕在线播放 | 蜜臀av在线播放 久久综合激激的五月天 | 无码纯肉视频在线观看 | 国产色视频一区二区三区 | 1000部啪啪未满十八勿入下载 | 亚洲国产精品一区二区美利坚 | 欧美日韩在线亚洲综合国产人 | 亚洲精品国产精品乱码视色 | 三级4级全黄60分钟 | 狂野欧美激情性xxxx | 亚洲日本在线电影 | 激情内射亚州一区二区三区爱妻 | 在线欧美精品一区二区三区 | 国产亚洲tv在线观看 | 国产精品亚洲lv粉色 | 久久zyz资源站无码中文动漫 | 蜜臀aⅴ国产精品久久久国产老师 | 久久综合给久久狠狠97色 | 国产成人综合美国十次 | 亚洲精品久久久久久久久久久 | 国产精品亚洲专区无码不卡 | 亚洲国产精品无码久久久久高潮 | 18精品久久久无码午夜福利 | 国产肉丝袜在线观看 | 亚洲色大成网站www | 欧美高清在线精品一区 | 亚洲国产av美女网站 | 成人欧美一区二区三区黑人免费 | 一区二区三区高清视频一 | 久久久久成人精品免费播放动漫 | 久久无码中文字幕免费影院蜜桃 | 亚洲中文字幕va福利 | 国产精品办公室沙发 | 欧美真人作爱免费视频 | 天天摸天天碰天天添 | 波多野结衣乳巨码无在线观看 | 88国产精品欧美一区二区三区 | 久久午夜无码鲁丝片午夜精品 | 97久久精品无码一区二区 | 中文字幕色婷婷在线视频 | 欧美 亚洲 国产 另类 | 天海翼激烈高潮到腰振不止 | 国产内射老熟女aaaa | 午夜精品久久久内射近拍高清 | 无码毛片视频一区二区本码 | 亚洲欧洲日本综合aⅴ在线 | 精品久久综合1区2区3区激情 | 自拍偷自拍亚洲精品被多人伦好爽 | 2019午夜福利不卡片在线 | 亚洲大尺度无码无码专区 | 欧美变态另类xxxx | 色欲久久久天天天综合网精品 | 久久国产精品萌白酱免费 | 中文字幕中文有码在线 | 亚洲中文字幕在线无码一区二区 | 麻豆md0077饥渴少妇 | 天天摸天天碰天天添 | 美女黄网站人色视频免费国产 | 欧美日韩久久久精品a片 | 亚洲の无码国产の无码影院 | 丰满护士巨好爽好大乳 | 国产精品爱久久久久久久 | 99久久久无码国产精品免费 | 欧美人与物videos另类 | 亚洲爆乳大丰满无码专区 | 国产成人精品一区二区在线小狼 | 婷婷综合久久中文字幕蜜桃三电影 | 婷婷五月综合缴情在线视频 | 人妻少妇精品久久 | 国产人妖乱国产精品人妖 | 东京无码熟妇人妻av在线网址 | 国产精品久免费的黄网站 | 欧美肥老太牲交大战 | 无码av免费一区二区三区试看 | 久久天天躁狠狠躁夜夜免费观看 | 久热国产vs视频在线观看 | 欧美成人家庭影院 | 国产suv精品一区二区五 | 中文字幕av无码一区二区三区电影 | 一区二区三区高清视频一 | 又大又紧又粉嫩18p少妇 | 99久久无码一区人妻 | 亚洲中文字幕在线无码一区二区 | 动漫av一区二区在线观看 | 天天拍夜夜添久久精品 | 狂野欧美性猛xxxx乱大交 | 欧美日本日韩 | 日韩精品无码一区二区中文字幕 | 天天拍夜夜添久久精品 | 丰满人妻翻云覆雨呻吟视频 | 一区二区传媒有限公司 | 色综合久久88色综合天天 | 四虎影视成人永久免费观看视频 | 精品久久久久香蕉网 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲国产一区二区三区在线观看 | 亚洲日韩精品欧美一区二区 | 日日摸天天摸爽爽狠狠97 | 欧美激情内射喷水高潮 | 亚洲午夜福利在线观看 | 麻豆国产人妻欲求不满谁演的 | 蜜臀av无码人妻精品 | 成人无码视频在线观看网站 | 成人无码精品1区2区3区免费看 | 99精品无人区乱码1区2区3区 | 又大又黄又粗又爽的免费视频 | 2019nv天堂香蕉在线观看 | 偷窥村妇洗澡毛毛多 | 日日碰狠狠丁香久燥 | 成人精品一区二区三区中文字幕 | 国产欧美熟妇另类久久久 | 久久综合香蕉国产蜜臀av | 捆绑白丝粉色jk震动捧喷白浆 | 欧美 亚洲 国产 另类 | 日本在线高清不卡免费播放 | 亚洲精品综合五月久久小说 | 宝宝好涨水快流出来免费视频 | 国产午夜精品一区二区三区嫩草 | 97资源共享在线视频 | 55夜色66夜色国产精品视频 | 亚洲高清偷拍一区二区三区 | 97夜夜澡人人双人人人喊 | 久久国产自偷自偷免费一区调 | 国精产品一区二区三区 | 色欲人妻aaaaaaa无码 | 国产香蕉尹人视频在线 | 99精品无人区乱码1区2区3区 | 全黄性性激高免费视频 | 亚洲爆乳精品无码一区二区三区 | 久久国产精品偷任你爽任你 | 久久精品人妻少妇一区二区三区 | 亚洲精品一区二区三区婷婷月 | 亚洲精品一区二区三区婷婷月 | 丰满人妻精品国产99aⅴ | 久久久久人妻一区精品色欧美 | 免费无码一区二区三区蜜桃大 | 国产精品手机免费 | 在线亚洲高清揄拍自拍一品区 | 精品厕所偷拍各类美女tp嘘嘘 | 午夜成人1000部免费视频 | 纯爱无遮挡h肉动漫在线播放 | 国产精品久久久久影院嫩草 | 无码人中文字幕 | 任你躁国产自任一区二区三区 | 免费无码一区二区三区蜜桃大 | 国产精品成人av在线观看 | 亚洲 a v无 码免 费 成 人 a v | 国产性生交xxxxx无码 | 午夜福利试看120秒体验区 | 伊人久久婷婷五月综合97色 | 精品国产一区av天美传媒 | 特级做a爰片毛片免费69 | 国产精品人人妻人人爽 | 日韩精品无码一本二本三本色 | 久久zyz资源站无码中文动漫 | 人妻少妇精品无码专区动漫 | 欧美熟妇另类久久久久久不卡 | 日韩 欧美 动漫 国产 制服 | 欧美日韩在线亚洲综合国产人 | 国产成人综合在线女婷五月99播放 | 午夜免费福利小电影 | 国产无遮挡吃胸膜奶免费看 | 国产成人精品久久亚洲高清不卡 | 永久黄网站色视频免费直播 | 午夜精品一区二区三区的区别 | 一区二区三区乱码在线 | 欧洲 | 2019nv天堂香蕉在线观看 | 无码一区二区三区在线 | 妺妺窝人体色www在线小说 | 美女张开腿让人桶 | 无码毛片视频一区二区本码 | 夜夜夜高潮夜夜爽夜夜爰爰 | 欧美人与禽zoz0性伦交 | 精品国产国产综合精品 | 男人的天堂2018无码 | 女人被男人躁得好爽免费视频 | 大胆欧美熟妇xx | 少妇人妻偷人精品无码视频 | 极品尤物被啪到呻吟喷水 | 在线a亚洲视频播放在线观看 | 久久久久99精品国产片 | 日日碰狠狠躁久久躁蜜桃 | 欧美三级不卡在线观看 | 久久综合给合久久狠狠狠97色 | 狠狠噜狠狠狠狠丁香五月 | av香港经典三级级 在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 东京热男人av天堂 | 久久精品人人做人人综合试看 | а√资源新版在线天堂 | 一区二区三区高清视频一 | 麻豆国产人妻欲求不满谁演的 | 波多野结衣高清一区二区三区 | 性啪啪chinese东北女人 | 乱人伦人妻中文字幕无码 | 99久久精品无码一区二区毛片 | 伊人久久大香线蕉av一区二区 | 色妞www精品免费视频 | 久久综合给久久狠狠97色 | 久久国产精品萌白酱免费 | 久久精品女人的天堂av | 色综合久久网 | 国产舌乚八伦偷品w中 | 亚洲综合在线一区二区三区 | 又粗又大又硬又长又爽 | www成人国产高清内射 | 国产精品久久精品三级 | 人妻插b视频一区二区三区 | 99久久精品午夜一区二区 | 国产成人无码区免费内射一片色欲 | 亚洲小说春色综合另类 | 中文无码成人免费视频在线观看 | 国产精品无码一区二区三区不卡 | 国产高清不卡无码视频 | 亚洲精品久久久久久一区二区 | 亚洲精品久久久久久一区二区 | 国产午夜福利100集发布 | 性生交大片免费看l | 亚洲熟妇色xxxxx欧美老妇 | 欧洲极品少妇 | 国产成人综合在线女婷五月99播放 | 四虎永久在线精品免费网址 | 国产乡下妇女做爰 | 亚洲人成影院在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 欧美国产日韩亚洲中文 | 波多野结衣aⅴ在线 | 亚洲aⅴ无码成人网站国产app | 精品国产一区二区三区四区 | 亚洲欧美综合区丁香五月小说 | 九九综合va免费看 | 精品无码国产一区二区三区av | 性色欲网站人妻丰满中文久久不卡 | 国产精品久久久午夜夜伦鲁鲁 | 精品人妻中文字幕有码在线 | 婷婷六月久久综合丁香 | 欧美 日韩 亚洲 在线 | 丰满岳乱妇在线观看中字无码 | 综合网日日天干夜夜久久 | 99久久精品无码一区二区毛片 | 欧美性生交活xxxxxdddd | 天天躁日日躁狠狠躁免费麻豆 | 午夜精品久久久久久久久 | 性做久久久久久久久 | 国产福利视频一区二区 | 狠狠躁日日躁夜夜躁2020 | 亚洲精品成人av在线 | 亚洲国产成人av在线观看 | 久久精品中文闷骚内射 | 亚洲日本在线电影 | 无码精品国产va在线观看dvd | 国产成人综合美国十次 | 成人精品天堂一区二区三区 | 精品无码av一区二区三区 | 亚洲综合无码一区二区三区 | 久久精品国产精品国产精品污 | 久久精品国产大片免费观看 | 亚洲gv猛男gv无码男同 | 久久久精品国产sm最大网站 | 99精品久久毛片a片 | 色诱久久久久综合网ywww | аⅴ资源天堂资源库在线 | 欧美 亚洲 国产 另类 | 亚洲va欧美va天堂v国产综合 | 大色综合色综合网站 | 日本熟妇人妻xxxxx人hd | 久久aⅴ免费观看 | 国产真人无遮挡作爱免费视频 | 日韩亚洲欧美精品综合 | av无码久久久久不卡免费网站 | 国产色视频一区二区三区 | 亚洲综合在线一区二区三区 | 夫妻免费无码v看片 | 中文字幕无线码免费人妻 | ass日本丰满熟妇pics | 国模大胆一区二区三区 | 狂野欧美性猛交免费视频 | 88国产精品欧美一区二区三区 | 婷婷色婷婷开心五月四房播播 | 无码毛片视频一区二区本码 | 人妻熟女一区 | 婷婷丁香五月天综合东京热 | 亚洲另类伦春色综合小说 | 中文字幕无码人妻少妇免费 | 国产精品a成v人在线播放 | 久久午夜夜伦鲁鲁片无码免费 | 老头边吃奶边弄进去呻吟 | 日本精品人妻无码免费大全 | 青青青手机频在线观看 | 欧美三级不卡在线观看 | 亚洲中文字幕久久无码 | 欧洲熟妇色 欧美 | 色婷婷综合激情综在线播放 | 亚洲欧美中文字幕5发布 | 精品偷自拍另类在线观看 | 漂亮人妻洗澡被公强 日日躁 | 久久久av男人的天堂 | 人妻夜夜爽天天爽三区 | 日本大乳高潮视频在线观看 | 国产av剧情md精品麻豆 | 黑人粗大猛烈进出高潮视频 | 国产精品亚洲综合色区韩国 | 国产极品美女高潮无套在线观看 | √天堂中文官网8在线 | 国产成人av免费观看 | 男女作爱免费网站 | 久久久久久av无码免费看大片 | 狠狠cao日日穞夜夜穞av | 久久人人爽人人爽人人片av高清 | 天天av天天av天天透 | 免费看男女做好爽好硬视频 | 精品无码一区二区三区的天堂 | 在线精品亚洲一区二区 | 奇米影视7777久久精品 | 中文无码精品a∨在线观看不卡 | 亚洲狠狠色丁香婷婷综合 | 亚洲人成人无码网www国产 | 国产电影无码午夜在线播放 | 亚洲啪av永久无码精品放毛片 | 少妇人妻av毛片在线看 | 中文字幕色婷婷在线视频 | 老太婆性杂交欧美肥老太 | 男女作爱免费网站 | 久久综合九色综合欧美狠狠 | 无码乱肉视频免费大全合集 | 色爱情人网站 | 宝宝好涨水快流出来免费视频 | 国产真实夫妇视频 | 日日摸天天摸爽爽狠狠97 | 欧美性猛交xxxx富婆 | 亚洲综合无码久久精品综合 | 亚洲成a人一区二区三区 | 无码人妻av免费一区二区三区 | 亚洲日本在线电影 | 欧美成人免费全部网站 | 亚洲va中文字幕无码久久不卡 | www一区二区www免费 | 欧洲熟妇精品视频 | 久久综合给合久久狠狠狠97色 | 蜜臀av无码人妻精品 | 国产精品va在线观看无码 | 人人澡人人透人人爽 | 好男人社区资源 | 对白脏话肉麻粗话av | 精品欧洲av无码一区二区三区 | 久久国语露脸国产精品电影 | 装睡被陌生人摸出水好爽 | 色窝窝无码一区二区三区色欲 | 波多野42部无码喷潮在线 | 欧美freesex黑人又粗又大 | v一区无码内射国产 | 久久精品国产日本波多野结衣 | 午夜精品久久久久久久 | 久久久久免费精品国产 | 六月丁香婷婷色狠狠久久 | 国产成人午夜福利在线播放 | 久久亚洲中文字幕精品一区 | 婷婷丁香五月天综合东京热 | 久久午夜夜伦鲁鲁片无码免费 | 国产手机在线αⅴ片无码观看 | 国产欧美熟妇另类久久久 | 亚洲人成无码网www | 精品久久久无码中文字幕 | 日韩av无码一区二区三区 | 亚洲国产精品久久人人爱 | 未满成年国产在线观看 | 88国产精品欧美一区二区三区 | 久久无码人妻影院 | 成人欧美一区二区三区 | 99视频精品全部免费免费观看 | 最新国产乱人伦偷精品免费网站 | 欧美人与动性行为视频 | 在线欧美精品一区二区三区 | 免费无码的av片在线观看 | 国产亚洲人成a在线v网站 | 日韩精品a片一区二区三区妖精 | 色五月丁香五月综合五月 | 亚洲精品久久久久中文第一幕 | 国产一区二区三区四区五区加勒比 | 999久久久国产精品消防器材 | 亚洲人成人无码网www国产 | 激情爆乳一区二区三区 | 老熟妇乱子伦牲交视频 | 国产成人无码午夜视频在线观看 | 亚洲日韩中文字幕在线播放 | 亚洲一区二区三区偷拍女厕 | 性啪啪chinese东北女人 | 欧美日韩在线亚洲综合国产人 | 5858s亚洲色大成网站www | 色婷婷久久一区二区三区麻豆 | 国产精品沙发午睡系列 | 97夜夜澡人人双人人人喊 | 免费无码一区二区三区蜜桃大 | 亚洲欧美精品aaaaaa片 | 国产成人综合在线女婷五月99播放 | 久久亚洲日韩精品一区二区三区 | 国产性生交xxxxx无码 | www国产亚洲精品久久网站 | 国产精品99爱免费视频 | 久久zyz资源站无码中文动漫 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 中文字幕av无码一区二区三区电影 | 国产精品无码mv在线观看 | 午夜福利电影 | 日本熟妇乱子伦xxxx | 熟女少妇在线视频播放 | 中国大陆精品视频xxxx | 久久亚洲精品成人无码 | 成人精品视频一区二区三区尤物 | 免费播放一区二区三区 | 国产激情精品一区二区三区 | 国产精品自产拍在线观看 | 国产成人无码av一区二区 | 久久综合给合久久狠狠狠97色 | 高清国产亚洲精品自在久久 | 欧美 日韩 亚洲 在线 | 国产午夜无码视频在线观看 | 亚洲日韩中文字幕在线播放 | 精品无码国产一区二区三区av | 中文精品无码中文字幕无码专区 | 欧美精品在线观看 | 久精品国产欧美亚洲色aⅴ大片 | 国产香蕉97碰碰久久人人 | 亚洲精品综合一区二区三区在线 | 欧美日韩一区二区三区自拍 | 精品久久久久久亚洲精品 | 麻豆成人精品国产免费 | 蜜桃视频插满18在线观看 | 亚洲欧美日韩国产精品一区二区 | 一个人免费观看的www视频 | 无码毛片视频一区二区本码 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 鲁鲁鲁爽爽爽在线视频观看 | 国产高潮视频在线观看 | 高潮毛片无遮挡高清免费 | 午夜男女很黄的视频 | 曰韩无码二三区中文字幕 | 日本一区二区三区免费播放 | 亚洲a无码综合a国产av中文 | 亚洲欧洲日本无在线码 | 欧美性猛交xxxx富婆 | 噜噜噜亚洲色成人网站 | 97久久精品无码一区二区 | 久久综合给合久久狠狠狠97色 | 国内精品人妻无码久久久影院 | 麻豆成人精品国产免费 | 无码一区二区三区在线 | 18黄暴禁片在线观看 | 成人aaa片一区国产精品 | 又大又硬又爽免费视频 | 亚洲精品一区二区三区四区五区 | 巨爆乳无码视频在线观看 | 午夜免费福利小电影 | 欧美阿v高清资源不卡在线播放 | 国产三级精品三级男人的天堂 | 国产免费久久久久久无码 | 久久人人爽人人爽人人片av高清 | 亚洲日韩精品欧美一区二区 | 久久久精品人妻久久影视 | 无遮无挡爽爽免费视频 | 国内综合精品午夜久久资源 | 99久久精品无码一区二区毛片 | 欧美人与禽猛交狂配 | 国产激情无码一区二区app | 亚洲熟悉妇女xxx妇女av | 欧美老妇交乱视频在线观看 | 国产精品理论片在线观看 | 丝袜 中出 制服 人妻 美腿 | 欧美黑人性暴力猛交喷水 | 欧美 日韩 亚洲 在线 | 久久无码中文字幕免费影院蜜桃 | 亚洲娇小与黑人巨大交 | 中文字幕无码免费久久9一区9 | 国产精品久久久午夜夜伦鲁鲁 | 在线视频网站www色 | 亚洲s码欧洲m码国产av | 老熟妇乱子伦牲交视频 | 少妇邻居内射在线 | 中文字幕 亚洲精品 第1页 | 超碰97人人射妻 | 欧美老熟妇乱xxxxx | 欧美猛少妇色xxxxx | 亚洲の无码国产の无码影院 | 高潮毛片无遮挡高清免费 | 国产精品沙发午睡系列 | 久久 国产 尿 小便 嘘嘘 | 强奷人妻日本中文字幕 | 丰满少妇熟乱xxxxx视频 | 色狠狠av一区二区三区 | 国产亚洲欧美在线专区 | 久久综合久久自在自线精品自 | 亲嘴扒胸摸屁股激烈网站 | 色 综合 欧美 亚洲 国产 | 免费男性肉肉影院 | 国产激情艳情在线看视频 | 人人爽人人澡人人高潮 | 天堂无码人妻精品一区二区三区 | 日本肉体xxxx裸交 | 久久久久久亚洲精品a片成人 | 在线观看国产一区二区三区 | 国语自产偷拍精品视频偷 | 亚洲va欧美va天堂v国产综合 | 精品一区二区三区波多野结衣 | 麻豆人妻少妇精品无码专区 | 六月丁香婷婷色狠狠久久 | 日韩无码专区 | 国产97在线 | 亚洲 | 老司机亚洲精品影院无码 | 美女张开腿让人桶 | 成熟妇人a片免费看网站 | 麻豆md0077饥渴少妇 | 无码福利日韩神码福利片 | 色五月丁香五月综合五月 | 夜夜躁日日躁狠狠久久av | 久久人人97超碰a片精品 | 内射后入在线观看一区 | 国产成人精品久久亚洲高清不卡 | 亚洲欧美国产精品久久 | 午夜熟女插插xx免费视频 | 久久伊人色av天堂九九小黄鸭 | 免费无码午夜福利片69 | 131美女爱做视频 | 波多野结衣 黑人 | 国产精品-区区久久久狼 | 一本一道久久综合久久 | 大肉大捧一进一出视频出来呀 | 亚洲国产精品无码一区二区三区 | 无码纯肉视频在线观看 | 日韩精品a片一区二区三区妖精 | 成人无码影片精品久久久 | 国产9 9在线 | 中文 | 国精品人妻无码一区二区三区蜜柚 | 国产亚洲tv在线观看 | 娇妻被黑人粗大高潮白浆 | 亚洲精品久久久久avwww潮水 | 综合网日日天干夜夜久久 | 亚洲中文字幕无码一久久区 | 永久黄网站色视频免费直播 | 国产精品多人p群无码 | 亚洲va欧美va天堂v国产综合 | 99国产欧美久久久精品 | 亚洲精品无码人妻无码 | 日本乱人伦片中文三区 | 国产又爽又黄又刺激的视频 | 欧洲极品少妇 | 啦啦啦www在线观看免费视频 | 日欧一片内射va在线影院 | 欧美日韩一区二区三区自拍 | 乱人伦人妻中文字幕无码久久网 | 小泽玛莉亚一区二区视频在线 | aa片在线观看视频在线播放 | www国产精品内射老师 | 成年女人永久免费看片 | 国产精品永久免费视频 | 精品一区二区三区无码免费视频 | 色婷婷综合激情综在线播放 | 无码一区二区三区在线 | 欧美野外疯狂做受xxxx高潮 | 色一情一乱一伦一区二区三欧美 | 亚洲自偷自偷在线制服 | 日本丰满熟妇videos | 在线观看免费人成视频 | 青春草在线视频免费观看 | 日本一区二区三区免费播放 | 无码福利日韩神码福利片 | 女人被男人躁得好爽免费视频 | 国精产品一品二品国精品69xx | 无码av免费一区二区三区试看 | 成人性做爰aaa片免费看 | 国产福利视频一区二区 | 欧美一区二区三区视频在线观看 | 国产真实乱对白精彩久久 | 久久久久成人精品免费播放动漫 | 九月婷婷人人澡人人添人人爽 | 久久精品国产日本波多野结衣 | 亚洲中文字幕无码中字 | 草草网站影院白丝内射 | 亚洲国产精品无码久久久久高潮 | 成人片黄网站色大片免费观看 | 纯爱无遮挡h肉动漫在线播放 | 成人综合网亚洲伊人 | √8天堂资源地址中文在线 | 亚洲日韩av片在线观看 | 99精品久久毛片a片 | 中文字幕av无码一区二区三区电影 | 免费视频欧美无人区码 | 国产一区二区不卡老阿姨 | 欧美怡红院免费全部视频 | 国产免费观看黄av片 | 老司机亚洲精品影院 | 51国偷自产一区二区三区 | 精品国产一区二区三区四区在线看 | 无码成人精品区在线观看 | 成熟女人特级毛片www免费 | 亚洲人成网站色7799 | 亚洲国产成人av在线观看 | 国产特级毛片aaaaaa高潮流水 | 亚洲中文无码av永久不收费 | 国产成人人人97超碰超爽8 | 欧洲熟妇色 欧美 | 国产高潮视频在线观看 | 欧美人妻一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 小泽玛莉亚一区二区视频在线 | 无码人妻出轨黑人中文字幕 | 国产亚洲视频中文字幕97精品 | 免费人成网站视频在线观看 | 亚洲熟妇色xxxxx欧美老妇 | 久久精品中文字幕大胸 | 性欧美疯狂xxxxbbbb | 人人超人人超碰超国产 | 国产深夜福利视频在线 | 精品一区二区三区无码免费视频 | 久久久久亚洲精品中文字幕 | 日本又色又爽又黄的a片18禁 | 十八禁视频网站在线观看 | 成人亚洲精品久久久久软件 | 最近免费中文字幕中文高清百度 | 丰满少妇熟乱xxxxx视频 | 99久久精品国产一区二区蜜芽 | 亚洲伊人久久精品影院 | 久久久久99精品成人片 | 无码国内精品人妻少妇 | 少妇太爽了在线观看 | 少妇高潮喷潮久久久影院 | 久久伊人色av天堂九九小黄鸭 | 欧美国产日产一区二区 | 免费无码午夜福利片69 | 少妇高潮一区二区三区99 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲无人区一区二区三区 | 久久 国产 尿 小便 嘘嘘 | 无套内谢的新婚少妇国语播放 | 无码人妻精品一区二区三区不卡 | 日日干夜夜干 | 午夜福利不卡在线视频 | 久久久久亚洲精品男人的天堂 | 国产精品久久久久久久9999 | 亚洲国产精品一区二区美利坚 | 激情人妻另类人妻伦 | 亚洲成av人在线观看网址 | 成 人影片 免费观看 | 国产特级毛片aaaaaaa高清 | а√资源新版在线天堂 | 人妻少妇被猛烈进入中文字幕 | 国产一精品一av一免费 | 野外少妇愉情中文字幕 | 亚洲中文字幕乱码av波多ji | 亚洲精品久久久久久一区二区 | 亚洲人成无码网www | 两性色午夜视频免费播放 | 国产成人综合美国十次 | 人妻少妇精品无码专区动漫 | 无码人妻久久一区二区三区不卡 | 日本高清一区免费中文视频 | 久久99精品久久久久久 | 国产午夜亚洲精品不卡 | 亚洲欧美国产精品久久 | 中文字幕人妻无码一区二区三区 | 精品一区二区三区波多野结衣 | 性开放的女人aaa片 | 亚洲精品鲁一鲁一区二区三区 | 亚洲精品国产品国语在线观看 | 网友自拍区视频精品 | 丰满人妻精品国产99aⅴ | 在线播放免费人成毛片乱码 | 国产香蕉尹人视频在线 | 中文亚洲成a人片在线观看 | 鲁大师影院在线观看 | 国产精品第一区揄拍无码 | 天天做天天爱天天爽综合网 | 97人妻精品一区二区三区 | 人人爽人人澡人人高潮 | 76少妇精品导航 | 露脸叫床粗话东北少妇 | 久久伊人色av天堂九九小黄鸭 | 中文字幕无码免费久久9一区9 | 亚洲日本一区二区三区在线 | 日本免费一区二区三区最新 | 久久综合九色综合欧美狠狠 | 99久久无码一区人妻 | 夜夜躁日日躁狠狠久久av | 精品国精品国产自在久国产87 | 又大又紧又粉嫩18p少妇 | 鲁大师影院在线观看 | 巨爆乳无码视频在线观看 | 永久免费观看美女裸体的网站 | av香港经典三级级 在线 | 国产精品嫩草久久久久 | 色综合久久久无码中文字幕 | 久久久久久国产精品无码下载 | 波多野结衣高清一区二区三区 | 久久综合九色综合欧美狠狠 | 国产av一区二区精品久久凹凸 | 两性色午夜免费视频 | 国产精品久久久久久久9999 | 无码av岛国片在线播放 | 暴力强奷在线播放无码 | 中文亚洲成a人片在线观看 | 亲嘴扒胸摸屁股激烈网站 | 国产精品亚洲一区二区三区喷水 | 成熟女人特级毛片www免费 | 免费看男女做好爽好硬视频 | 人妻无码久久精品人妻 | 亚洲天堂2017无码中文 | 夜精品a片一区二区三区无码白浆 | 国产激情综合五月久久 | 亚洲色在线无码国产精品不卡 | 国产成人无码专区 | 国产av一区二区精品久久凹凸 | 岛国片人妻三上悠亚 | 亚洲国产精品美女久久久久 | 午夜无码人妻av大片色欲 | 日韩 欧美 动漫 国产 制服 | 欧美成人免费全部网站 | 最近中文2019字幕第二页 | 久激情内射婷内射蜜桃人妖 | 男人扒开女人内裤强吻桶进去 | 亚洲 另类 在线 欧美 制服 | 久久精品国产大片免费观看 | 亚洲人成影院在线无码按摩店 | 国产精品亚洲综合色区韩国 | 国产亚洲精品久久久久久大师 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 精品成在人线av无码免费看 | 又大又硬又黄的免费视频 | 野狼第一精品社区 | 色爱情人网站 | 国产日产欧产精品精品app | 亚洲人成影院在线观看 | 久久 国产 尿 小便 嘘嘘 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲国产精品久久久天堂 | аⅴ资源天堂资源库在线 | 国产午夜亚洲精品不卡下载 | 午夜嘿嘿嘿影院 | 成人综合网亚洲伊人 | 国产亲子乱弄免费视频 | 又粗又大又硬毛片免费看 | 成人免费视频一区二区 | 蜜臀aⅴ国产精品久久久国产老师 | 久久综合给久久狠狠97色 | 成熟妇人a片免费看网站 | 黑人巨大精品欧美一区二区 | 大乳丰满人妻中文字幕日本 | 亚洲欧洲中文日韩av乱码 | 人妻中文无码久热丝袜 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲国产一区二区三区在线观看 | 国产精品久久久一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 无遮挡国产高潮视频免费观看 | 欧洲极品少妇 | 嫩b人妻精品一区二区三区 | 无码帝国www无码专区色综合 | 图片小说视频一区二区 | 天堂亚洲2017在线观看 | 色五月五月丁香亚洲综合网 | 午夜熟女插插xx免费视频 | 人妻人人添人妻人人爱 | 免费看少妇作爱视频 | 好屌草这里只有精品 | 国产亚洲欧美在线专区 | 成人欧美一区二区三区黑人 | 99麻豆久久久国产精品免费 | 日韩av激情在线观看 | 国产成人无码专区 | 国产sm调教视频在线观看 | 国产精品国产自线拍免费软件 | 日本大乳高潮视频在线观看 | 少妇被粗大的猛进出69影院 | 蜜臀aⅴ国产精品久久久国产老师 | 少妇性l交大片 | 久久久久久九九精品久 | 中文亚洲成a人片在线观看 | 亚洲日韩一区二区三区 | 男女猛烈xx00免费视频试看 | 欧美亚洲日韩国产人成在线播放 | 99久久99久久免费精品蜜桃 | 色欲久久久天天天综合网精品 | 国产在线精品一区二区三区直播 | 久久无码中文字幕免费影院蜜桃 | 性色欲情网站iwww九文堂 | 国产av人人夜夜澡人人爽麻豆 | 又湿又紧又大又爽a视频国产 | 日欧一片内射va在线影院 | 国产激情精品一区二区三区 | 性史性农村dvd毛片 | 欧美日韩久久久精品a片 | 中文字幕乱码亚洲无线三区 | 日本欧美一区二区三区乱码 | 日韩人妻少妇一区二区三区 | 亚洲国产精华液网站w | 中文字幕乱码亚洲无线三区 | 无码av岛国片在线播放 | 熟女俱乐部五十路六十路av | 亚洲人交乣女bbw | 久精品国产欧美亚洲色aⅴ大片 | 精品久久综合1区2区3区激情 | 久久久久久亚洲精品a片成人 | 自拍偷自拍亚洲精品10p | 欧美老妇交乱视频在线观看 | 亚洲男女内射在线播放 | 大胆欧美熟妇xx | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 久久久婷婷五月亚洲97号色 | 夜精品a片一区二区三区无码白浆 | 国产无套内射久久久国产 | 久久久久成人片免费观看蜜芽 | 蜜桃视频插满18在线观看 | 成人免费视频视频在线观看 免费 | 国产精品视频免费播放 | 亚洲中文字幕在线观看 | 日本精品久久久久中文字幕 | 亚洲精品综合五月久久小说 | 日日夜夜撸啊撸 | 亚洲码国产精品高潮在线 | 国产精品无码一区二区三区不卡 | 精品久久久久香蕉网 | 亚洲中文字幕乱码av波多ji | 中文字幕无码av波多野吉衣 | 色综合视频一区二区三区 | 高潮喷水的毛片 | 日韩无码专区 | 色婷婷香蕉在线一区二区 | 俺去俺来也在线www色官网 | 国产精品亚洲а∨无码播放麻豆 | 国产一区二区三区日韩精品 | 麻豆国产人妻欲求不满谁演的 | 一区二区三区高清视频一 | 日产精品高潮呻吟av久久 | 精品人妻人人做人人爽 | 亚洲日韩一区二区 | 亚洲爆乳大丰满无码专区 | 国产乱人无码伦av在线a | 国精产品一品二品国精品69xx | 99视频精品全部免费免费观看 | 女高中生第一次破苞av | 欧美激情综合亚洲一二区 | 久久国产精品精品国产色婷婷 | 国产成人精品优优av | 亚洲成熟女人毛毛耸耸多 | 久久午夜无码鲁丝片午夜精品 | 国产香蕉97碰碰久久人人 | 欧美老人巨大xxxx做受 | 亚洲熟妇自偷自拍另类 | 国产国语老龄妇女a片 | 黑人巨大精品欧美一区二区 | 老司机亚洲精品影院无码 | 成人无码精品1区2区3区免费看 | 日本大乳高潮视频在线观看 | 亚洲色www成人永久网址 | 女人高潮内射99精品 | 老熟女重囗味hdxx69 | 国产成人精品久久亚洲高清不卡 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲成av人片在线观看无码不卡 | 性色欲网站人妻丰满中文久久不卡 | 天天av天天av天天透 | 男女超爽视频免费播放 | 无码吃奶揉捏奶头高潮视频 | 国产真实伦对白全集 | 午夜肉伦伦影院 | 久久久久久a亚洲欧洲av冫 | 97精品人妻一区二区三区香蕉 | 国内揄拍国内精品少妇国语 | 中文字幕无码热在线视频 | 麻豆国产人妻欲求不满 | 中文字幕 人妻熟女 | 国产av久久久久精东av | 精品国产一区二区三区四区在线看 | 在线观看国产一区二区三区 | 日韩精品乱码av一区二区 | 国产人妻大战黑人第1集 | www成人国产高清内射 | 久久午夜无码鲁丝片午夜精品 | 亚洲精品午夜无码电影网 | 99精品无人区乱码1区2区3区 | 欧美日本精品一区二区三区 | 国产免费久久精品国产传媒 | 欧美日韩视频无码一区二区三 | 免费无码一区二区三区蜜桃大 | 色欲人妻aaaaaaa无码 | 久久99精品国产.久久久久 | 真人与拘做受免费视频 | 老子影院午夜精品无码 | 日日鲁鲁鲁夜夜爽爽狠狠 | 色五月五月丁香亚洲综合网 | 中文字幕无码免费久久9一区9 | 熟妇女人妻丰满少妇中文字幕 | 日韩精品成人一区二区三区 | 久热国产vs视频在线观看 | 日日碰狠狠躁久久躁蜜桃 | 国产婷婷色一区二区三区在线 | 两性色午夜视频免费播放 | 国产精品沙发午睡系列 | 精品久久久无码中文字幕 | 成人av无码一区二区三区 | 国产suv精品一区二区五 | 熟女俱乐部五十路六十路av | 女人色极品影院 | 久久久久人妻一区精品色欧美 | 国产电影无码午夜在线播放 | 国产精品第一国产精品 | 日韩精品无码免费一区二区三区 | 国产亲子乱弄免费视频 | 日本精品人妻无码免费大全 | 好男人www社区 | 色综合久久久无码网中文 | 亚洲 日韩 欧美 成人 在线观看 | 一区二区三区乱码在线 | 欧洲 | 欧美一区二区三区 | 欧美一区二区三区视频在线观看 | 午夜精品一区二区三区的区别 | 乱码午夜-极国产极内射 | 97久久超碰中文字幕 | 特黄特色大片免费播放器图片 | 国产精品福利视频导航 | 国产suv精品一区二区五 | 国产亚洲人成在线播放 | 久久国产精品精品国产色婷婷 | 人妻体内射精一区二区三四 | 波多野42部无码喷潮在线 | 岛国片人妻三上悠亚 | 亚洲中文字幕无码一久久区 | 大乳丰满人妻中文字幕日本 | 久久亚洲中文字幕精品一区 | 性啪啪chinese东北女人 | 亚洲gv猛男gv无码男同 | 成人精品视频一区二区三区尤物 | av无码久久久久不卡免费网站 | 精品久久久久久人妻无码中文字幕 | 亚洲午夜无码久久 | 内射爽无广熟女亚洲 | 欧美老妇与禽交 | 内射白嫩少妇超碰 | 亚洲天堂2017无码 | 窝窝午夜理论片影院 | 日本欧美一区二区三区乱码 | 亚洲成色在线综合网站 | 牛和人交xxxx欧美 | 久久亚洲精品中文字幕无男同 | 2020久久超碰国产精品最新 | 狠狠综合久久久久综合网 | 国产av一区二区精品久久凹凸 | 欧美老熟妇乱xxxxx | 欧美成人高清在线播放 | 日日碰狠狠躁久久躁蜜桃 | 亚洲国产精品一区二区第一页 | 99er热精品视频 | 国内精品一区二区三区不卡 | 啦啦啦www在线观看免费视频 | 一本大道伊人av久久综合 | 成人aaa片一区国产精品 | 亚洲色欲色欲天天天www | 国产成人精品视频ⅴa片软件竹菊 | 久久亚洲精品中文字幕无男同 | 国色天香社区在线视频 | 97精品人妻一区二区三区香蕉 | 国产亚洲人成a在线v网站 | 三级4级全黄60分钟 | 女人被男人爽到呻吟的视频 | 澳门永久av免费网站 | 婷婷色婷婷开心五月四房播播 | 国产av一区二区精品久久凹凸 | 人人澡人人透人人爽 | 精品人人妻人人澡人人爽人人 | 久久精品国产99精品亚洲 | 国产97人人超碰caoprom | 国产黄在线观看免费观看不卡 | 丰满人妻翻云覆雨呻吟视频 | 亚洲国产日韩a在线播放 | 三级4级全黄60分钟 | 国产成人无码a区在线观看视频app | аⅴ资源天堂资源库在线 | 免费看男女做好爽好硬视频 | 蜜桃臀无码内射一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 全黄性性激高免费视频 | 亚洲一区二区三区国产精华液 | 亚洲无人区午夜福利码高清完整版 | 亚洲国产精品毛片av不卡在线 | 亚洲精品国偷拍自产在线麻豆 | 久久精品中文字幕一区 | 日韩少妇白浆无码系列 | 日日摸夜夜摸狠狠摸婷婷 | 熟妇人妻无乱码中文字幕 | 久久视频在线观看精品 | 国产情侣作爱视频免费观看 | 无码av最新清无码专区吞精 | 1000部夫妻午夜免费 | 少妇高潮一区二区三区99 | 欧美成人家庭影院 | 亚洲小说春色综合另类 | 精品乱子伦一区二区三区 | 少妇无套内谢久久久久 | 亚洲欧美精品伊人久久 | 性欧美牲交在线视频 | 亚洲热妇无码av在线播放 | 初尝人妻少妇中文字幕 | 国产精品久久久久9999小说 | 999久久久国产精品消防器材 | 亚洲阿v天堂在线 | 亚洲中文字幕va福利 | 性欧美牲交在线视频 | 131美女爱做视频 | 中文字幕日韩精品一区二区三区 | 久久国产精品精品国产色婷婷 | 无码国产激情在线观看 | 人人妻人人澡人人爽欧美一区 | 东京热一精品无码av | 日本www一道久久久免费榴莲 | 国产精华av午夜在线观看 | 久久无码人妻影院 | 亚洲精品久久久久久一区二区 | 丰满护士巨好爽好大乳 | 波多野42部无码喷潮在线 | 久久久久久久久888 | 亚洲 高清 成人 动漫 | 国产香蕉尹人综合在线观看 | 亚洲精品一区国产 | 亚洲男女内射在线播放 | 国产精品igao视频网 | 国产乱人伦av在线无码 | 久久99久久99精品中文字幕 | 131美女爱做视频 | 久久久久久av无码免费看大片 | 日本一区二区更新不卡 | 色老头在线一区二区三区 | 亚洲精品中文字幕 | 精品久久久无码人妻字幂 | 久久国产精品_国产精品 | 国产免费观看黄av片 | 久久综合给合久久狠狠狠97色 | 国产激情综合五月久久 | 亚洲午夜久久久影院 | 男女猛烈xx00免费视频试看 | 一二三四在线观看免费视频 | 奇米影视888欧美在线观看 | 国产免费观看黄av片 | 东京热一精品无码av | 波多野结衣aⅴ在线 | yw尤物av无码国产在线观看 | 丰满人妻翻云覆雨呻吟视频 | 日韩av无码一区二区三区不卡 | 国产av无码专区亚洲awww | 亚洲国产综合无码一区 | 麻豆国产丝袜白领秘书在线观看 | 乌克兰少妇xxxx做受 | 亚洲综合色区中文字幕 | 99国产精品白浆在线观看免费 | 欧美一区二区三区视频在线观看 | 亚洲国产精品美女久久久久 | 草草网站影院白丝内射 | 内射爽无广熟女亚洲 | 麻豆md0077饥渴少妇 | 人妻aⅴ无码一区二区三区 | 成人试看120秒体验区 | 欧美丰满熟妇xxxx性ppx人交 | 成在人线av无码免费 | 久久精品无码一区二区三区 | 18禁止看的免费污网站 | 久久久精品国产sm最大网站 | 国产精品高潮呻吟av久久4虎 | 精品人妻中文字幕有码在线 | 久久久久久九九精品久 | 俄罗斯老熟妇色xxxx | 国产一区二区三区影院 | 熟女体下毛毛黑森林 | 国产精品成人av在线观看 | 国产亚洲视频中文字幕97精品 | 久久国产精品_国产精品 | 麻豆果冻传媒2021精品传媒一区下载 | 国产又爽又黄又刺激的视频 | 小泽玛莉亚一区二区视频在线 | 任你躁在线精品免费 | 99精品无人区乱码1区2区3区 | 十八禁真人啪啪免费网站 | 免费观看又污又黄的网站 | 久久国产精品偷任你爽任你 | 久久久国产精品无码免费专区 | 国产舌乚八伦偷品w中 | 精品无人区无码乱码毛片国产 | а天堂中文在线官网 | 国产精品18久久久久久麻辣 | 久久综合久久自在自线精品自 | 亚洲精品久久久久中文第一幕 | 风流少妇按摩来高潮 | 久久这里只有精品视频9 | 无码人妻黑人中文字幕 | 日本精品少妇一区二区三区 | 久久综合九色综合欧美狠狠 | 奇米影视7777久久精品 | 亚洲第一网站男人都懂 | 成年美女黄网站色大免费全看 | 亚洲精品综合一区二区三区在线 | 国产精品第一国产精品 | 成人精品一区二区三区中文字幕 | 精品aⅴ一区二区三区 | 爆乳一区二区三区无码 | 激情五月综合色婷婷一区二区 | 丰腴饱满的极品熟妇 | 天堂久久天堂av色综合 | 夜先锋av资源网站 | 亚洲天堂2017无码 | 久久五月精品中文字幕 | 日日碰狠狠丁香久燥 | 男人的天堂av网站 | 呦交小u女精品视频 | 精品一区二区三区波多野结衣 | 国产成人无码午夜视频在线观看 | 国内老熟妇对白xxxxhd | 国产午夜无码精品免费看 | 国产一精品一av一免费 | 国产精品18久久久久久麻辣 | 性色欲情网站iwww九文堂 | 动漫av一区二区在线观看 | 18无码粉嫩小泬无套在线观看 | 强伦人妻一区二区三区视频18 | 国产乡下妇女做爰 | 无遮无挡爽爽免费视频 | 呦交小u女精品视频 | 麻花豆传媒剧国产免费mv在线 | 国产 浪潮av性色四虎 | 中文精品久久久久人妻不卡 | 初尝人妻少妇中文字幕 | 久久国产精品_国产精品 | 丁香花在线影院观看在线播放 | 国产乱人伦偷精品视频 | 男女下面进入的视频免费午夜 | 欧美国产亚洲日韩在线二区 | 国产精品资源一区二区 | 97精品国产97久久久久久免费 | 又色又爽又黄的美女裸体网站 | 乱码av麻豆丝袜熟女系列 | 嫩b人妻精品一区二区三区 | 红桃av一区二区三区在线无码av | 天堂一区人妻无码 | 亚洲欧美日韩国产精品一区二区 | 激情内射亚州一区二区三区爱妻 | 久久亚洲a片com人成 | 久久综合网欧美色妞网 | 亚洲人成影院在线观看 | 日韩人妻无码一区二区三区久久99 | 国产人妻人伦精品1国产丝袜 | 欧美日韩综合一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 亚洲综合色区中文字幕 | 玩弄少妇高潮ⅹxxxyw | 一本久久伊人热热精品中文字幕 | 免费无码的av片在线观看 | 伊人久久婷婷五月综合97色 | 久久久精品人妻久久影视 | 久久精品人妻少妇一区二区三区 | 午夜性刺激在线视频免费 | 天下第一社区视频www日本 | 国内精品人妻无码久久久影院 | 国产精品久久久久久久影院 | 中文字幕亚洲情99在线 | 在线 国产 欧美 亚洲 天堂 | 日韩欧美群交p片內射中文 | 偷窥村妇洗澡毛毛多 | 久久精品人人做人人综合 | 国产极品视觉盛宴 | 300部国产真实乱 | 成人精品视频一区二区 | 国产精品爱久久久久久久 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久久久久免费看成人影片 | 国产乱人无码伦av在线a | 欧美阿v高清资源不卡在线播放 | 久久久久se色偷偷亚洲精品av | 国产精品第一国产精品 | 亚洲精品一区三区三区在线观看 | 精品久久久无码中文字幕 | 高清不卡一区二区三区 | 色 综合 欧美 亚洲 国产 | 精品夜夜澡人妻无码av蜜桃 | 青青草原综合久久大伊人精品 | 国产亚洲精品久久久久久久久动漫 | 亚洲国产高清在线观看视频 | 国产乱人伦偷精品视频 | 色综合天天综合狠狠爱 | 四虎4hu永久免费 | 性色欲情网站iwww九文堂 | 性做久久久久久久久 | 亚洲中文无码av永久不收费 | 日本大乳高潮视频在线观看 | 丰腴饱满的极品熟妇 | 高潮毛片无遮挡高清免费视频 | 无码精品人妻一区二区三区av | 清纯唯美经典一区二区 | 欧洲欧美人成视频在线 | 久久国产精品精品国产色婷婷 | 麻豆国产人妻欲求不满谁演的 | 成人亚洲精品久久久久软件 | 18无码粉嫩小泬无套在线观看 | 最新国产乱人伦偷精品免费网站 | 欧美35页视频在线观看 | 亚洲一区二区三区含羞草 | 久热国产vs视频在线观看 | 男女爱爱好爽视频免费看 | 亚洲日韩av一区二区三区中文 | 精品国产福利一区二区 | 国产手机在线αⅴ片无码观看 | 大地资源网第二页免费观看 | 狠狠亚洲超碰狼人久久 | 国内综合精品午夜久久资源 | 中文字幕日产无线码一区 | 正在播放东北夫妻内射 | 天堂久久天堂av色综合 | 国产亚洲精品久久久久久久久动漫 | 十八禁真人啪啪免费网站 | 精品偷自拍另类在线观看 | 欧美乱妇无乱码大黄a片 | ass日本丰满熟妇pics | 香港三级日本三级妇三级 | 婷婷五月综合缴情在线视频 | 午夜无码人妻av大片色欲 | 欧美 日韩 人妻 高清 中文 | а√天堂www在线天堂小说 | 成年美女黄网站色大免费视频 | 丰满人妻一区二区三区免费视频 | 激情国产av做激情国产爱 | 国产精品无码mv在线观看 | 爱做久久久久久 | 色综合久久久无码中文字幕 | 亚洲精品中文字幕乱码 | 久久精品成人欧美大片 | 亚洲男人av香蕉爽爽爽爽 | 内射老妇bbwx0c0ck | 一本大道伊人av久久综合 | 少妇的肉体aa片免费 | 天天拍夜夜添久久精品大 | 麻豆成人精品国产免费 | 最近的中文字幕在线看视频 | 对白脏话肉麻粗话av | 97无码免费人妻超级碰碰夜夜 | 色一情一乱一伦一区二区三欧美 | 久久国产精品二国产精品 | 成人免费视频一区二区 | 丁香花在线影院观看在线播放 | 少妇无码一区二区二三区 | 宝宝好涨水快流出来免费视频 | 久久综合狠狠综合久久综合88 | 丝袜美腿亚洲一区二区 | 十八禁视频网站在线观看 | 成人精品天堂一区二区三区 | 亚洲国产高清在线观看视频 | 青草视频在线播放 | 久久精品国产99精品亚洲 | 亚洲综合无码一区二区三区 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 日韩精品无码一本二本三本色 | 在线观看欧美一区二区三区 | 97人妻精品一区二区三区 | 娇妻被黑人粗大高潮白浆 | 色一情一乱一伦一区二区三欧美 | 波多野42部无码喷潮在线 | 又粗又大又硬毛片免费看 | 理论片87福利理论电影 | 国产suv精品一区二区五 | 少妇无码一区二区二三区 | 少妇被粗大的猛进出69影院 | 国产人妻人伦精品1国产丝袜 | 18禁黄网站男男禁片免费观看 | 国产精品久久久午夜夜伦鲁鲁 | 国产免费观看黄av片 | 玩弄少妇高潮ⅹxxxyw | 少妇人妻大乳在线视频 | 久久久精品成人免费观看 | 福利一区二区三区视频在线观看 | 国产美女极度色诱视频www | 对白脏话肉麻粗话av | 国产精品亚洲综合色区韩国 | 免费观看黄网站 | 永久免费观看国产裸体美女 | 久久人人爽人人爽人人片av高清 | 1000部夫妻午夜免费 | 国产成人精品无码播放 | 国产精品沙发午睡系列 | 国产精品自产拍在线观看 | 狂野欧美性猛交免费视频 | 两性色午夜免费视频 | 人人澡人人妻人人爽人人蜜桃 | www一区二区www免费 | 国产成人综合在线女婷五月99播放 | 久久久久av无码免费网 | 久青草影院在线观看国产 | 四虎影视成人永久免费观看视频 | 中文字幕无码av激情不卡 | 日本熟妇大屁股人妻 | 天堂无码人妻精品一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 一区二区三区高清视频一 | 三上悠亚人妻中文字幕在线 | 国产口爆吞精在线视频 | 成 人 网 站国产免费观看 | 亚洲性无码av中文字幕 | 成人亚洲精品久久久久 | 亚洲精品国产精品乱码视色 | 精品无码成人片一区二区98 | 天天拍夜夜添久久精品大 | 波多野结衣一区二区三区av免费 | 亚洲中文字幕在线无码一区二区 | 亚洲国产综合无码一区 | 国产欧美亚洲精品a | 99麻豆久久久国产精品免费 | 激情爆乳一区二区三区 | 亚洲日本一区二区三区在线 | 亚洲s色大片在线观看 | 麻花豆传媒剧国产免费mv在线 | 中文字幕 亚洲精品 第1页 | 久久zyz资源站无码中文动漫 | 亚洲国产欧美在线成人 | 精品无人区无码乱码毛片国产 | 国产农村乱对白刺激视频 | 国产精品久久久久9999小说 | 国产又粗又硬又大爽黄老大爷视 | 98国产精品综合一区二区三区 | 少妇无码吹潮 | 欧美日韩久久久精品a片 | 久久午夜无码鲁丝片午夜精品 | a在线亚洲男人的天堂 | 九九综合va免费看 | 成人av无码一区二区三区 | 国产综合色产在线精品 | 日日摸夜夜摸狠狠摸婷婷 | 大乳丰满人妻中文字幕日本 | 丰满人妻被黑人猛烈进入 | 亚洲一区av无码专区在线观看 | 成人片黄网站色大片免费观看 | 亚洲国产精品一区二区第一页 | 福利一区二区三区视频在线观看 | 亚洲第一网站男人都懂 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 午夜精品久久久内射近拍高清 | 欧美性生交xxxxx久久久 | 国产精品久久久久久久9999 | 亚洲色在线无码国产精品不卡 | 少妇无套内谢久久久久 | 乱码午夜-极国产极内射 | 18精品久久久无码午夜福利 | 领导边摸边吃奶边做爽在线观看 | 久久久久亚洲精品男人的天堂 | 日本精品少妇一区二区三区 | 国产综合久久久久鬼色 | 欧美一区二区三区视频在线观看 | 国产sm调教视频在线观看 | 免费看男女做好爽好硬视频 | 国内揄拍国内精品人妻 | 日本丰满熟妇videos | 亚洲人成无码网www | 最新国产麻豆aⅴ精品无码 | 日本成熟视频免费视频 | 色婷婷香蕉在线一区二区 | 又大又硬又爽免费视频 | 性生交大片免费看l | 少妇人妻偷人精品无码视频 | 大肉大捧一进一出好爽视频 | 99国产欧美久久久精品 | 国产偷国产偷精品高清尤物 | 亚洲s码欧洲m码国产av | 亚洲一区二区三区播放 | 久久精品视频在线看15 | 乱人伦中文视频在线观看 | 精品人妻人人做人人爽夜夜爽 | 99riav国产精品视频 | 国产精品高潮呻吟av久久4虎 | 丰满人妻精品国产99aⅴ | 99久久精品国产一区二区蜜芽 | 高中生自慰www网站 | 久久国产精品偷任你爽任你 | 男女下面进入的视频免费午夜 | 亚洲男人av天堂午夜在 | 精品国产一区二区三区四区 | 国内丰满熟女出轨videos | 99精品视频在线观看免费 | 精品无码国产自产拍在线观看蜜 | 毛片内射-百度 | ass日本丰满熟妇pics | 天下第一社区视频www日本 | 男人扒开女人内裤强吻桶进去 | 麻豆蜜桃av蜜臀av色欲av | 日产国产精品亚洲系列 | 免费国产黄网站在线观看 | 无码免费一区二区三区 | 中文亚洲成a人片在线观看 | 久久久国产精品无码免费专区 | 精品日本一区二区三区在线观看 | 无套内射视频囯产 | 好爽又高潮了毛片免费下载 | 国产亚洲精品久久久久久国模美 | 国产亚洲美女精品久久久2020 | 无码纯肉视频在线观看 | 又大又紧又粉嫩18p少妇 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美亚洲国产一区二区三区 | 欧美日韩综合一区二区三区 | 曰韩少妇内射免费播放 | 清纯唯美经典一区二区 | 女人被男人躁得好爽免费视频 | av香港经典三级级 在线 | 国产亚洲人成a在线v网站 | 网友自拍区视频精品 | 精品aⅴ一区二区三区 | 国产成人人人97超碰超爽8 | 久久久www成人免费毛片 | 麻豆国产丝袜白领秘书在线观看 | 狠狠cao日日穞夜夜穞av | 麻豆国产97在线 | 欧洲 | 成年美女黄网站色大免费视频 | 日本欧美一区二区三区乱码 | 国产精品va在线观看无码 | 亚洲a无码综合a国产av中文 | 亚洲一区二区观看播放 | 欧美色就是色 | 97se亚洲精品一区 | 成熟人妻av无码专区 | 欧美人与禽猛交狂配 | 中国大陆精品视频xxxx | 国内精品一区二区三区不卡 | 最近的中文字幕在线看视频 | 国产真实伦对白全集 | 一本久道久久综合狠狠爱 | 亚洲国产欧美国产综合一区 | 精品无码一区二区三区的天堂 | 性色欲网站人妻丰满中文久久不卡 | 女人被男人躁得好爽免费视频 | 香港三级日本三级妇三级 | 亚洲va欧美va天堂v国产综合 | 久久国产精品萌白酱免费 | 少妇被粗大的猛进出69影院 | 久久久久亚洲精品男人的天堂 | 国产人妻精品一区二区三区不卡 | 男女性色大片免费网站 | 亚洲欧美精品aaaaaa片 | 色五月丁香五月综合五月 | 西西人体www44rt大胆高清 | 国产肉丝袜在线观看 | 麻豆国产97在线 | 欧洲 | 中文精品久久久久人妻不卡 | 中文字幕av无码一区二区三区电影 | 亚洲成a人片在线观看日本 | 午夜福利一区二区三区在线观看 | 成熟人妻av无码专区 | 99久久久无码国产精品免费 | 老司机亚洲精品影院无码 | 久久亚洲a片com人成 | 亚洲精品一区二区三区婷婷月 | 麻豆国产97在线 | 欧洲 | 成人性做爰aaa片免费看不忠 | 欧美真人作爱免费视频 | 亚洲国产av美女网站 | 亚洲精品成人福利网站 | 中文字幕无线码免费人妻 | 一本大道久久东京热无码av | 国产午夜精品一区二区三区嫩草 | 97夜夜澡人人爽人人喊中国片 | 亚洲精品久久久久久久久久久 | 人妻少妇精品视频专区 | 无码国内精品人妻少妇 | 一本久道久久综合婷婷五月 | 亚洲啪av永久无码精品放毛片 | 牲交欧美兽交欧美 | 中国女人内谢69xxxxxa片 | 少妇厨房愉情理9仑片视频 | 久精品国产欧美亚洲色aⅴ大片 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 成熟人妻av无码专区 | 乌克兰少妇xxxx做受 | 国精产品一区二区三区 | 又湿又紧又大又爽a视频国产 | 又色又爽又黄的美女裸体网站 | 久久99精品国产麻豆蜜芽 | 国产av无码专区亚洲awww | 精品国产成人一区二区三区 | 日韩精品无码一本二本三本色 | 麻豆av传媒蜜桃天美传媒 | 中文字幕无码日韩欧毛 | 亚洲国产成人av在线观看 | 国产欧美精品一区二区三区 | 精品国产一区二区三区av 性色 | 国产欧美精品一区二区三区 | 一本加勒比波多野结衣 | 午夜福利试看120秒体验区 | 国产精品理论片在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 久久精品人妻少妇一区二区三区 | 久久久久久a亚洲欧洲av冫 | 乌克兰少妇xxxx做受 | 激情综合激情五月俺也去 | 中文字幕无码av激情不卡 | 日韩人妻无码一区二区三区久久99 | 熟女少妇人妻中文字幕 | 初尝人妻少妇中文字幕 | 欧美阿v高清资源不卡在线播放 | 国内少妇偷人精品视频 | 亚洲国产av美女网站 | 狠狠色丁香久久婷婷综合五月 | 亚洲精品综合一区二区三区在线 | 四虎永久在线精品免费网址 | 精品久久久无码人妻字幂 | 大屁股大乳丰满人妻 | 久久久久成人片免费观看蜜芽 | 狠狠躁日日躁夜夜躁2020 | 亚洲国产精品久久久天堂 | 亚洲精品一区二区三区大桥未久 | 国产精品国产三级国产专播 | 永久免费观看国产裸体美女 | 国产在线精品一区二区高清不卡 | 婷婷五月综合激情中文字幕 | 国产特级毛片aaaaaaa高清 | 国产sm调教视频在线观看 | 久久久国产精品无码免费专区 | 日韩av无码中文无码电影 | 四虎永久在线精品免费网址 | 亚洲啪av永久无码精品放毛片 | 国产午夜亚洲精品不卡 | 成 人 免费观看网站 | 国产午夜精品一区二区三区嫩草 | 亚洲一区av无码专区在线观看 | 久久综合激激的五月天 | 东北女人啪啪对白 | 日本护士xxxxhd少妇 | 久久亚洲国产成人精品性色 | 精品人人妻人人澡人人爽人人 | 无码人妻少妇伦在线电影 | 久久精品国产一区二区三区 | 亚洲色www成人永久网址 | 国产精品美女久久久久av爽李琼 | 欧美一区二区三区视频在线观看 | 久久精品国产亚洲精品 | 国内综合精品午夜久久资源 | 国产午夜亚洲精品不卡 | 日本熟妇乱子伦xxxx | 亚洲国产一区二区三区在线观看 | 亚洲s码欧洲m码国产av | 免费无码一区二区三区蜜桃大 | 精品国产福利一区二区 | 日产精品99久久久久久 | 小sao货水好多真紧h无码视频 | 久久综合给久久狠狠97色 | 国产高潮视频在线观看 | 强辱丰满人妻hd中文字幕 | 午夜精品一区二区三区的区别 | 97久久超碰中文字幕 | 亚洲 日韩 欧美 成人 在线观看 | 少妇无码av无码专区在线观看 | 国产精品久久久久无码av色戒 | 妺妺窝人体色www婷婷 | 熟妇人妻激情偷爽文 | 日韩无码专区 | 精品少妇爆乳无码av无码专区 | 国内揄拍国内精品少妇国语 | 久久国产自偷自偷免费一区调 | 精品无码一区二区三区爱欲 | 亚洲呦女专区 | 国产人妻人伦精品1国产丝袜 | 2020久久香蕉国产线看观看 | 亲嘴扒胸摸屁股激烈网站 | 国产后入清纯学生妹 | 人妻互换免费中文字幕 | 久久亚洲日韩精品一区二区三区 | 男人和女人高潮免费网站 | 亚洲成av人片在线观看无码不卡 | 久久综合久久自在自线精品自 | 国产亚洲欧美日韩亚洲中文色 | 日韩无套无码精品 | 久久人人爽人人人人片 | 亚洲综合无码久久精品综合 | 人人澡人人妻人人爽人人蜜桃 | 激情亚洲一区国产精品 | 狠狠色色综合网站 | 欧美日韩人成综合在线播放 | 日韩 欧美 动漫 国产 制服 | 亚洲国产综合无码一区 | 欧美黑人巨大xxxxx |