久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    色窝窝无码一区二区三区色欲 | 性色欲网站人妻丰满中文久久不卡 | 国产特级毛片aaaaaaa高清 | 欧美性猛交内射兽交老熟妇 | 2020最新国产自产精品 | 成人无码精品1区2区3区免费看 | 国产在热线精品视频 | 十八禁真人啪啪免费网站 | 人妻无码久久精品人妻 | 欧美日本精品一区二区三区 | 亚洲日本一区二区三区在线 | 亚洲成a人片在线观看无码 | 国产精品久久久久9999小说 | 亚洲欧美精品aaaaaa片 | aⅴ亚洲 日韩 色 图网站 播放 | 99re在线播放 | 久久精品国产大片免费观看 | 亚洲啪av永久无码精品放毛片 | 国产精品久久久 | 牲欲强的熟妇农村老妇女 | 亚洲日韩av一区二区三区四区 | 四十如虎的丰满熟妇啪啪 | 性欧美videos高清精品 | 东京无码熟妇人妻av在线网址 | 国产又爽又黄又刺激的视频 | 精品日本一区二区三区在线观看 | 99久久亚洲精品无码毛片 | 无遮无挡爽爽免费视频 | 内射欧美老妇wbb | 风流少妇按摩来高潮 | 国产性生交xxxxx无码 | 国产精品二区一区二区aⅴ污介绍 | 天干天干啦夜天干天2017 | 国产乱码精品一品二品 | 亚洲日本一区二区三区在线 | 少妇愉情理伦片bd | 无码人妻丰满熟妇区毛片18 | 亚洲精品一区二区三区大桥未久 | 欧美一区二区三区 | 色综合久久网 | 日韩欧美中文字幕公布 | 丰满岳乱妇在线观看中字无码 | 亚洲va中文字幕无码久久不卡 | 日韩人妻无码一区二区三区久久99 | 亚洲色偷偷男人的天堂 | 成熟人妻av无码专区 | 国产97人人超碰caoprom | 亚洲国产综合无码一区 | 欧美精品免费观看二区 | 国产片av国语在线观看 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲午夜福利在线观看 | 国产在热线精品视频 | 久激情内射婷内射蜜桃人妖 | 亚洲小说春色综合另类 | 国产av无码专区亚洲a∨毛片 | 中文字幕乱码中文乱码51精品 | 国产免费无码一区二区视频 | 国产精品美女久久久久av爽李琼 | 国产超级va在线观看视频 | 全球成人中文在线 | 日韩亚洲欧美精品综合 | 国产后入清纯学生妹 | 无码精品人妻一区二区三区av | 少妇久久久久久人妻无码 | 成人无码视频在线观看网站 | 一个人看的www免费视频在线观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 午夜精品久久久久久久久 | 一区二区三区乱码在线 | 欧洲 | 毛片内射-百度 | 亚洲精品一区二区三区在线观看 | 欧美日本精品一区二区三区 | 天干天干啦夜天干天2017 | 亚洲一区二区三区无码久久 | 精品一区二区三区无码免费视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 日韩精品乱码av一区二区 | 亚洲国产精品久久久久久 | 久久成人a毛片免费观看网站 | 亚洲国产一区二区三区在线观看 | 亚洲自偷自拍另类第1页 | 国产精品亚洲lv粉色 | 久久精品国产日本波多野结衣 | 免费人成网站视频在线观看 | 丰满人妻被黑人猛烈进入 | 中文字幕 亚洲精品 第1页 | 男女下面进入的视频免费午夜 | 亚洲熟妇色xxxxx亚洲 | 76少妇精品导航 | 欧美日韩亚洲国产精品 | 久久综合给合久久狠狠狠97色 | 国产成人精品优优av | 男人扒开女人内裤强吻桶进去 | 人妻无码久久精品人妻 | 纯爱无遮挡h肉动漫在线播放 | 51国偷自产一区二区三区 | 无遮无挡爽爽免费视频 | 捆绑白丝粉色jk震动捧喷白浆 | 无码精品国产va在线观看dvd | 国产成人午夜福利在线播放 | 沈阳熟女露脸对白视频 | 亚洲国产综合无码一区 | 亚洲成av人片天堂网无码】 | 亚洲va欧美va天堂v国产综合 | 人妻体内射精一区二区三四 | 国产精品成人av在线观看 | 男女下面进入的视频免费午夜 | √8天堂资源地址中文在线 | 无码人妻丰满熟妇区毛片18 | 天堂亚洲2017在线观看 | 国产亚洲精品久久久久久国模美 | 欧美日韩色另类综合 | 性啪啪chinese东北女人 | 日本大乳高潮视频在线观看 | 国产麻豆精品一区二区三区v视界 | 天干天干啦夜天干天2017 | 日日橹狠狠爱欧美视频 | 激情内射日本一区二区三区 | 欧美国产日产一区二区 | 国产av人人夜夜澡人人爽麻豆 | 少妇一晚三次一区二区三区 | 欧美人与禽zoz0性伦交 | 日韩精品a片一区二区三区妖精 | 天堂亚洲2017在线观看 | 亚洲国产高清在线观看视频 | 国产色在线 | 国产 | 亚洲日韩av一区二区三区四区 | 欧美xxxxx精品 | 日韩欧美成人免费观看 | 四虎国产精品免费久久 | 嫩b人妻精品一区二区三区 | 色一情一乱一伦一视频免费看 | 97资源共享在线视频 | 无码中文字幕色专区 | 天堂亚洲2017在线观看 | 人妻人人添人妻人人爱 | 日韩精品一区二区av在线 | 国产精品久久国产三级国 | 国产精品久久福利网站 | 亚洲中文无码av永久不收费 | 国产精品久久久久无码av色戒 | 久久婷婷五月综合色国产香蕉 | 久久国产精品偷任你爽任你 | 国产精品亚洲综合色区韩国 | 中文字幕无线码 | 欧美日韩人成综合在线播放 | 久久精品中文闷骚内射 | 无码av中文字幕免费放 | 午夜精品一区二区三区在线观看 | 综合激情五月综合激情五月激情1 | 欧美乱妇无乱码大黄a片 | 任你躁国产自任一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品亚洲韩国一区二区三区 | 亚洲精品一区国产 | 俺去俺来也在线www色官网 | 国内精品人妻无码久久久影院蜜桃 | 成人影院yy111111在线观看 | 亚洲啪av永久无码精品放毛片 | 精品偷拍一区二区三区在线看 | 亚洲伊人久久精品影院 | 国产精品第一区揄拍无码 | 日本熟妇人妻xxxxx人hd | 欧美阿v高清资源不卡在线播放 | 少妇厨房愉情理9仑片视频 | 亚洲一区二区三区在线观看网站 | 国产精品亚洲一区二区三区喷水 | 欧美日本精品一区二区三区 | 精品国产一区二区三区四区在线看 | 在教室伦流澡到高潮hnp视频 | 乱人伦中文视频在线观看 | 日日麻批免费40分钟无码 | 四虎国产精品一区二区 | 久久这里只有精品视频9 | 熟妇人妻无乱码中文字幕 | 亚洲欧美日韩成人高清在线一区 | 久久久精品456亚洲影院 | 最新版天堂资源中文官网 | 日日摸天天摸爽爽狠狠97 | 97无码免费人妻超级碰碰夜夜 | 精品久久久久久亚洲精品 | 高潮毛片无遮挡高清免费视频 | 狠狠综合久久久久综合网 | 欧美乱妇无乱码大黄a片 | 国产美女极度色诱视频www | 久久久久久九九精品久 | 最新国产麻豆aⅴ精品无码 | 国产精品久久久久久亚洲毛片 | 无码av免费一区二区三区试看 | 男女下面进入的视频免费午夜 | 亚洲精品鲁一鲁一区二区三区 | 欧洲精品码一区二区三区免费看 | 97无码免费人妻超级碰碰夜夜 | 成年美女黄网站色大免费视频 | 国内精品九九久久久精品 | 欧美日韩在线亚洲综合国产人 | 内射爽无广熟女亚洲 | 丝袜足控一区二区三区 | 日本一卡2卡3卡四卡精品网站 | 国产精品亚洲а∨无码播放麻豆 | 麻豆成人精品国产免费 | 日本免费一区二区三区最新 | 日本精品人妻无码免费大全 | 欧美日韩综合一区二区三区 | 亚洲熟熟妇xxxx | 无码人妻久久一区二区三区不卡 | 丰满诱人的人妻3 | 少妇性荡欲午夜性开放视频剧场 | 无码av岛国片在线播放 | www国产精品内射老师 | 国产成人精品视频ⅴa片软件竹菊 | 人妻无码αv中文字幕久久琪琪布 | 啦啦啦www在线观看免费视频 | 无码国内精品人妻少妇 | 暴力强奷在线播放无码 | 日韩视频 中文字幕 视频一区 | 无码吃奶揉捏奶头高潮视频 | 国产农村乱对白刺激视频 | 免费国产成人高清在线观看网站 | 国产精品自产拍在线观看 | 亚洲成在人网站无码天堂 | 中文字幕日产无线码一区 | 亚洲精品一区国产 | 久久人人爽人人爽人人片av高清 | 国产 浪潮av性色四虎 | 欧美熟妇另类久久久久久多毛 | 国产乱人无码伦av在线a | 欧美人与善在线com | 国产真实夫妇视频 | 男女爱爱好爽视频免费看 | 国产人妻大战黑人第1集 | 中文字幕色婷婷在线视频 | 99久久久国产精品无码免费 | √天堂资源地址中文在线 | 免费观看激色视频网站 | 国产黄在线观看免费观看不卡 | 亚洲国产欧美日韩精品一区二区三区 | 天天拍夜夜添久久精品大 | 中文无码伦av中文字幕 | 在线观看国产午夜福利片 | 亚洲阿v天堂在线 | 成人免费视频一区二区 | 国产精品无码一区二区桃花视频 | 亚洲 激情 小说 另类 欧美 | 国产69精品久久久久app下载 | 无码国模国产在线观看 | 四虎影视成人永久免费观看视频 | 久久国产36精品色熟妇 | 亚洲一区二区观看播放 | 国产精品理论片在线观看 | 少妇久久久久久人妻无码 | 亚洲欧美日韩成人高清在线一区 | 日韩人妻系列无码专区 | 午夜时刻免费入口 | 婷婷综合久久中文字幕蜜桃三电影 | 18无码粉嫩小泬无套在线观看 | 樱花草在线社区www | 国产高清av在线播放 | 国产莉萝无码av在线播放 | 欧美精品免费观看二区 | 国产在线精品一区二区高清不卡 | 大肉大捧一进一出视频出来呀 | 美女张开腿让人桶 | 亚洲色www成人永久网址 | 欧美成人午夜精品久久久 | 国产一区二区三区四区五区加勒比 | 亚洲精品成人福利网站 | 精品亚洲韩国一区二区三区 | 男女超爽视频免费播放 | 国产人妻久久精品二区三区老狼 | 中文字幕无码日韩专区 | 欧美日韩一区二区免费视频 | 无码av最新清无码专区吞精 | 亚拍精品一区二区三区探花 | 国产精品鲁鲁鲁 | 少妇无套内谢久久久久 | 亚洲小说春色综合另类 | 国产成人综合色在线观看网站 | 精品一二三区久久aaa片 | 免费无码的av片在线观看 | 久久综合久久自在自线精品自 | 76少妇精品导航 | 久久精品国产一区二区三区 | 六月丁香婷婷色狠狠久久 | 精品无码一区二区三区的天堂 | 一本精品99久久精品77 | 青草视频在线播放 | 亚洲精品中文字幕乱码 | 无码乱肉视频免费大全合集 | 娇妻被黑人粗大高潮白浆 | 欧美国产日产一区二区 | 久久久久se色偷偷亚洲精品av | 蜜桃无码一区二区三区 | 国产成人综合美国十次 | 欧美精品无码一区二区三区 | 亚洲欧美日韩综合久久久 | 久久99精品国产麻豆蜜芽 | 国产精品香蕉在线观看 | 亚洲综合无码一区二区三区 | 国产乱人无码伦av在线a | 午夜丰满少妇性开放视频 | 成人综合网亚洲伊人 | 人妻少妇精品无码专区动漫 | 国产成人av免费观看 | 中文字幕 亚洲精品 第1页 | 中文字幕av无码一区二区三区电影 | 国产精品久久久久久久影院 | 国产成人综合美国十次 | 熟妇人妻无码xxx视频 | 色综合视频一区二区三区 | 国产区女主播在线观看 | 国产精品久久久久久无码 | 午夜成人1000部免费视频 | 国产在线aaa片一区二区99 | 黑人巨大精品欧美黑寡妇 | 无遮挡国产高潮视频免费观看 | 国产性生交xxxxx无码 | 人妻aⅴ无码一区二区三区 | 婷婷色婷婷开心五月四房播播 | 麻豆国产人妻欲求不满 | 夜夜夜高潮夜夜爽夜夜爰爰 | 99久久精品午夜一区二区 | 日韩精品无码一区二区中文字幕 | 亚洲日韩av一区二区三区四区 | 少妇无码吹潮 | 久久综合香蕉国产蜜臀av | 熟女体下毛毛黑森林 | 亚洲欧美精品aaaaaa片 | 亚洲精品国偷拍自产在线麻豆 | 国产成人一区二区三区在线观看 | 性色欲网站人妻丰满中文久久不卡 | 午夜性刺激在线视频免费 | 日韩欧美成人免费观看 | 精品欧美一区二区三区久久久 | 免费观看的无遮挡av | 欧美国产日产一区二区 | 亚洲成av人片在线观看无码不卡 | 午夜免费福利小电影 | 国产精品沙发午睡系列 | 四十如虎的丰满熟妇啪啪 | 97人妻精品一区二区三区 | 一个人看的视频www在线 | 麻豆蜜桃av蜜臀av色欲av | 黑人巨大精品欧美一区二区 | 青青久在线视频免费观看 | 国产猛烈高潮尖叫视频免费 | 国产精品自产拍在线观看 | 一本色道久久综合狠狠躁 | 婷婷综合久久中文字幕蜜桃三电影 | 天天躁夜夜躁狠狠是什么心态 | 波多野结衣乳巨码无在线观看 | 亚洲天堂2017无码中文 | 久久精品女人天堂av免费观看 | 亚洲欧美中文字幕5发布 | 天下第一社区视频www日本 | 欧美怡红院免费全部视频 | 欧美日韩久久久精品a片 | 骚片av蜜桃精品一区 | 亚洲成av人综合在线观看 | 国产又爽又猛又粗的视频a片 | 国产精品国产自线拍免费软件 | 亚洲国产综合无码一区 | 麻豆国产人妻欲求不满谁演的 | 内射白嫩少妇超碰 | 精品国产福利一区二区 | 精品成在人线av无码免费看 | 131美女爱做视频 | 成人欧美一区二区三区黑人免费 | 扒开双腿吃奶呻吟做受视频 | 日本熟妇人妻xxxxx人hd | 亚洲精品一区二区三区在线观看 | 欧美日韩色另类综合 | 天堂久久天堂av色综合 | 中国女人内谢69xxxxxa片 | 中文字幕乱妇无码av在线 | 亚洲综合无码一区二区三区 | 免费网站看v片在线18禁无码 | 又粗又大又硬又长又爽 | av无码久久久久不卡免费网站 | 波多野结衣高清一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 欧美精品国产综合久久 | 大地资源中文第3页 | 成年女人永久免费看片 | 久久精品丝袜高跟鞋 | 欧美精品无码一区二区三区 | 国产又爽又黄又刺激的视频 | 亚洲中文字幕乱码av波多ji | av在线亚洲欧洲日产一区二区 | 日产国产精品亚洲系列 | 女人被男人躁得好爽免费视频 | 天干天干啦夜天干天2017 | 国产精品无套呻吟在线 | 亚洲一区二区三区国产精华液 | 亚洲综合伊人久久大杳蕉 | 成人片黄网站色大片免费观看 | 久久综合给合久久狠狠狠97色 | 无码人妻丰满熟妇区毛片18 | 亚洲中文字幕无码中字 | 性生交片免费无码看人 | 午夜嘿嘿嘿影院 | 日韩av无码一区二区三区不卡 | 精品偷自拍另类在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 国产精品毛多多水多 | 欧美午夜特黄aaaaaa片 | 丰满人妻被黑人猛烈进入 | 无码国内精品人妻少妇 | 亚洲精品成人福利网站 | 中文字幕乱码中文乱码51精品 | 美女扒开屁股让男人桶 | 国产av人人夜夜澡人人爽麻豆 | 扒开双腿疯狂进出爽爽爽视频 | 女人被男人爽到呻吟的视频 | 亚洲天堂2017无码中文 | 国产欧美熟妇另类久久久 | aⅴ亚洲 日韩 色 图网站 播放 | 老子影院午夜伦不卡 | 欧洲美熟女乱又伦 | 精品人人妻人人澡人人爽人人 | 中文字幕无线码免费人妻 | 亚洲国产综合无码一区 | 无码国产乱人伦偷精品视频 | 亚洲 高清 成人 动漫 | 欧美真人作爱免费视频 | 人人妻人人藻人人爽欧美一区 | 欧美日韩一区二区三区自拍 | 国产成人综合在线女婷五月99播放 | 亚洲精品无码人妻无码 | 午夜福利一区二区三区在线观看 | 欧美放荡的少妇 | 久久亚洲国产成人精品性色 | 久久综合给久久狠狠97色 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 久久精品女人天堂av免费观看 | 亚洲日韩av一区二区三区中文 | 天天摸天天透天天添 | 波多野结衣一区二区三区av免费 | 欧美日韩一区二区三区自拍 | 丰满岳乱妇在线观看中字无码 | 欧美xxxx黑人又粗又长 | aa片在线观看视频在线播放 | 久久天天躁狠狠躁夜夜免费观看 | 大地资源网第二页免费观看 | 国产成人av免费观看 | 成熟妇人a片免费看网站 | 亚洲人成影院在线观看 | 牛和人交xxxx欧美 | 成人免费视频在线观看 | 亚洲精品中文字幕乱码 | 精品无码一区二区三区爱欲 | 亚洲一区二区三区国产精华液 | 精品国偷自产在线 | 国产精品-区区久久久狼 | 高清国产亚洲精品自在久久 | 国内精品人妻无码久久久影院蜜桃 | 亚洲综合在线一区二区三区 | 色综合久久网 | 久久精品国产大片免费观看 | 天下第一社区视频www日本 | 无码人妻av免费一区二区三区 | 亲嘴扒胸摸屁股激烈网站 | 午夜男女很黄的视频 | 亚洲成在人网站无码天堂 | 国产suv精品一区二区五 | 亚洲综合另类小说色区 | 色综合天天综合狠狠爱 | 老子影院午夜精品无码 | 人人妻人人澡人人爽欧美精品 | 噜噜噜亚洲色成人网站 | 亚洲大尺度无码无码专区 | 国产一区二区三区日韩精品 | 特黄特色大片免费播放器图片 | 日欧一片内射va在线影院 | 人妻无码久久精品人妻 | 国产无遮挡又黄又爽又色 | 国产极品视觉盛宴 | 久久久成人毛片无码 | 亚洲 高清 成人 动漫 | 青青草原综合久久大伊人精品 | 又粗又大又硬又长又爽 | 无码人妻出轨黑人中文字幕 | 少妇人妻av毛片在线看 | 福利一区二区三区视频在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 暴力强奷在线播放无码 | 亚洲欧美日韩国产精品一区二区 | 久久综合九色综合欧美狠狠 | 国产两女互慰高潮视频在线观看 | 亚洲自偷自拍另类第1页 | 性欧美大战久久久久久久 | 国产成人无码a区在线观看视频app | 国产舌乚八伦偷品w中 | 国产区女主播在线观看 | 亚洲 欧美 激情 小说 另类 | 亚洲国产精品毛片av不卡在线 | 熟妇女人妻丰满少妇中文字幕 | 天天综合网天天综合色 | 日产精品99久久久久久 | 国产福利视频一区二区 | 小sao货水好多真紧h无码视频 | 亚洲午夜无码久久 | 亚洲va中文字幕无码久久不卡 | 久久97精品久久久久久久不卡 | 国产精品毛多多水多 | 久久久久se色偷偷亚洲精品av | 国产suv精品一区二区五 | 久久婷婷五月综合色国产香蕉 | 大乳丰满人妻中文字幕日本 | 兔费看少妇性l交大片免费 | 色婷婷久久一区二区三区麻豆 | 欧美性色19p | 宝宝好涨水快流出来免费视频 | 久久精品国产99久久6动漫 | 国产美女极度色诱视频www | 国产精品香蕉在线观看 | 久久视频在线观看精品 | 国产亚洲精品久久久久久久久动漫 | 精品成在人线av无码免费看 | 老熟女乱子伦 | 精品水蜜桃久久久久久久 | www国产亚洲精品久久久日本 | 永久免费观看美女裸体的网站 | 色婷婷香蕉在线一区二区 | 狠狠色欧美亚洲狠狠色www | 无码国内精品人妻少妇 | 国产精品人妻一区二区三区四 | 人妻少妇被猛烈进入中文字幕 | 精品成人av一区二区三区 | 午夜福利试看120秒体验区 | 人妻少妇精品视频专区 | 午夜不卡av免费 一本久久a久久精品vr综合 | 男女下面进入的视频免费午夜 | 午夜无码区在线观看 | 一本久久a久久精品亚洲 | 免费无码午夜福利片69 | 久久久久成人精品免费播放动漫 | 55夜色66夜色国产精品视频 | 亚洲va欧美va天堂v国产综合 | 免费看少妇作爱视频 | 麻花豆传媒剧国产免费mv在线 | 国产亚洲日韩欧美另类第八页 | 国产艳妇av在线观看果冻传媒 | 国产人妻大战黑人第1集 | 丰满少妇熟乱xxxxx视频 | 日本一卡2卡3卡四卡精品网站 | 一本加勒比波多野结衣 | 麻豆md0077饥渴少妇 | 国产精品高潮呻吟av久久 | 欧美性黑人极品hd | 亚洲欧美色中文字幕在线 | 色老头在线一区二区三区 | 少妇人妻大乳在线视频 | 欧洲熟妇精品视频 | 亚洲熟熟妇xxxx | 爆乳一区二区三区无码 | 少妇被黑人到高潮喷出白浆 | 亚洲色大成网站www | 野外少妇愉情中文字幕 | 天天做天天爱天天爽综合网 | 狠狠cao日日穞夜夜穞av | 丝袜人妻一区二区三区 | 久久无码中文字幕免费影院蜜桃 | 久久久精品人妻久久影视 | 亚洲精品国偷拍自产在线麻豆 | 国产农村妇女高潮大叫 | 婷婷丁香六月激情综合啪 | 国产真实夫妇视频 | 国产精品爱久久久久久久 | 少妇的肉体aa片免费 | 少妇的肉体aa片免费 | 欧美国产日韩久久mv | 色欲久久久天天天综合网精品 | 国产成人一区二区三区别 | 澳门永久av免费网站 | 天干天干啦夜天干天2017 | 亚洲大尺度无码无码专区 | 97se亚洲精品一区 | 99麻豆久久久国产精品免费 | 国产亚洲精品久久久久久 | 国产av一区二区精品久久凹凸 | 日韩av无码中文无码电影 | 在线天堂新版最新版在线8 | 夜夜高潮次次欢爽av女 | 兔费看少妇性l交大片免费 | 色欲久久久天天天综合网精品 | 77777熟女视频在线观看 а天堂中文在线官网 | 成人动漫在线观看 | 欧美刺激性大交 | 激情内射日本一区二区三区 | av在线亚洲欧洲日产一区二区 | 精品无码一区二区三区的天堂 | 麻豆精品国产精华精华液好用吗 | 99麻豆久久久国产精品免费 | 超碰97人人做人人爱少妇 | 一本色道婷婷久久欧美 | 最近免费中文字幕中文高清百度 | 久久99精品久久久久久 | 日本一卡2卡3卡四卡精品网站 | 久久久久成人片免费观看蜜芽 | 在线看片无码永久免费视频 | 西西人体www44rt大胆高清 | 久久国产精品_国产精品 | 国产乱人伦偷精品视频 | 激情五月综合色婷婷一区二区 | 久久久av男人的天堂 | 99久久久无码国产精品免费 | 亚欧洲精品在线视频免费观看 | 日本高清一区免费中文视频 | 无码av岛国片在线播放 | 日韩精品久久久肉伦网站 | 欧美性黑人极品hd | 欧美性猛交xxxx富婆 | 一本久久伊人热热精品中文字幕 | 久久久久久a亚洲欧洲av冫 | 亚洲色欲久久久综合网东京热 | 巨爆乳无码视频在线观看 | 无人区乱码一区二区三区 | 国产明星裸体无码xxxx视频 | 999久久久国产精品消防器材 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲狠狠色丁香婷婷综合 | 国产人妖乱国产精品人妖 | 国产办公室秘书无码精品99 | 高清无码午夜福利视频 | 国产成人无码区免费内射一片色欲 | 久久国产自偷自偷免费一区调 | 十八禁视频网站在线观看 | 天堂а√在线中文在线 | 人妻人人添人妻人人爱 | 无码人妻精品一区二区三区不卡 | 人人爽人人爽人人片av亚洲 | 亚洲の无码国产の无码影院 | 亚洲精品成a人在线观看 | 午夜精品一区二区三区的区别 | 亚洲国产精品无码一区二区三区 | а√天堂www在线天堂小说 | www国产精品内射老师 | 国产一区二区三区精品视频 | 人妻夜夜爽天天爽三区 | 又大又紧又粉嫩18p少妇 | 欧美精品国产综合久久 | 伊人色综合久久天天小片 | 无码av岛国片在线播放 | 精品国产av色一区二区深夜久久 | 亚洲国产精品久久久久久 | 风流少妇按摩来高潮 | 午夜福利试看120秒体验区 | 麻豆精产国品 | 免费视频欧美无人区码 | 久久天天躁夜夜躁狠狠 | 国产亚洲精品久久久久久国模美 | a在线亚洲男人的天堂 | 99久久无码一区人妻 | 国产亚洲精品精品国产亚洲综合 | 一本久道久久综合婷婷五月 | 国产综合色产在线精品 | 偷窥村妇洗澡毛毛多 | 天堂а√在线地址中文在线 | 国产欧美精品一区二区三区 | 欧美日韩人成综合在线播放 | 亚洲欧美日韩综合久久久 | a片在线免费观看 | 牲欲强的熟妇农村老妇女视频 | 亚洲va欧美va天堂v国产综合 | 国产精品99久久精品爆乳 | 亚洲熟悉妇女xxx妇女av | 67194成是人免费无码 | 永久免费精品精品永久-夜色 | 国产成人亚洲综合无码 | 国产av人人夜夜澡人人爽麻豆 | 荫蒂被男人添的好舒服爽免费视频 | 无码午夜成人1000部免费视频 | 国产精品人人爽人人做我的可爱 | 亚洲经典千人经典日产 | 亚洲一区二区三区 | 夜先锋av资源网站 | 极品尤物被啪到呻吟喷水 | 国产suv精品一区二区五 | 成人免费视频视频在线观看 免费 | 中文字幕av无码一区二区三区电影 | 欧美亚洲日韩国产人成在线播放 | 亚洲综合无码一区二区三区 | 精品熟女少妇av免费观看 | 亚洲综合久久一区二区 | 亚洲人成人无码网www国产 | 国产精品人人爽人人做我的可爱 | 久久人妻内射无码一区三区 | 欧美老妇与禽交 | 装睡被陌生人摸出水好爽 | 亚洲日本在线电影 | 亚洲爆乳精品无码一区二区三区 | av人摸人人人澡人人超碰下载 | 精品夜夜澡人妻无码av蜜桃 | 九九久久精品国产免费看小说 | 精品国产福利一区二区 | 欧美人与善在线com | 亚洲人成网站在线播放942 | 99久久久国产精品无码免费 | 成熟女人特级毛片www免费 | 国产欧美精品一区二区三区 | 久在线观看福利视频 | 99久久99久久免费精品蜜桃 | 狠狠cao日日穞夜夜穞av | 女人被爽到呻吟gif动态图视看 | 一区二区三区乱码在线 | 欧洲 | 亚洲综合精品香蕉久久网 | 午夜无码人妻av大片色欲 | 67194成是人免费无码 | 国产无遮挡又黄又爽免费视频 | 丰满护士巨好爽好大乳 | 99久久人妻精品免费一区 | 国产成人无码区免费内射一片色欲 | 99久久99久久免费精品蜜桃 | 欧美 日韩 人妻 高清 中文 | 亚洲日韩一区二区 | 精品无码国产自产拍在线观看蜜 | 日韩在线不卡免费视频一区 | 伊在人天堂亚洲香蕉精品区 | 国产精品二区一区二区aⅴ污介绍 | 亚洲精品一区三区三区在线观看 | 中文字幕乱码人妻无码久久 | 欧美性生交活xxxxxdddd | 蜜桃视频韩日免费播放 | 久久国产精品二国产精品 | 久久99精品久久久久久动态图 | 性欧美videos高清精品 | 亚洲人亚洲人成电影网站色 | 中文字幕乱码亚洲无线三区 | 国产激情精品一区二区三区 | 国产乱人无码伦av在线a | 亚洲综合久久一区二区 | 亚洲区欧美区综合区自拍区 | 久久精品国产精品国产精品污 | 午夜精品一区二区三区的区别 | 国产肉丝袜在线观看 | 久久综合给久久狠狠97色 | 欧美高清在线精品一区 | 国产精品丝袜黑色高跟鞋 | 大屁股大乳丰满人妻 | 国产午夜亚洲精品不卡下载 | 乌克兰少妇xxxx做受 | 无码成人精品区在线观看 | 亚洲无人区午夜福利码高清完整版 | 亚洲成av人片在线观看无码不卡 | 精品无码成人片一区二区98 | 国产成人午夜福利在线播放 | 风流少妇按摩来高潮 | 97夜夜澡人人爽人人喊中国片 | 无套内射视频囯产 | 欧美刺激性大交 | 欧美xxxxx精品 | 成人精品视频一区二区 | 欧美日韩精品 | 中文字幕无码av激情不卡 | 综合人妻久久一区二区精品 | а√资源新版在线天堂 | 亚洲国产精品无码久久久久高潮 | 国产美女精品一区二区三区 | 精品国产一区二区三区四区在线看 | 老头边吃奶边弄进去呻吟 | 日本一本二本三区免费 | 国产精品无码永久免费888 | av在线亚洲欧洲日产一区二区 | 无码一区二区三区在线 | 亚洲啪av永久无码精品放毛片 | 爆乳一区二区三区无码 | 久久亚洲精品中文字幕无男同 | 婷婷综合久久中文字幕蜜桃三电影 | 久久天天躁夜夜躁狠狠 | 国内精品久久久久久中文字幕 | 久久无码人妻影院 | 麻豆蜜桃av蜜臀av色欲av | 伊人久久大香线蕉午夜 | 久久久久成人精品免费播放动漫 | 中文字幕乱码人妻无码久久 | 18黄暴禁片在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲一区二区三区播放 | 亚洲区欧美区综合区自拍区 | 精品国产成人一区二区三区 | 99视频精品全部免费免费观看 | 人妻夜夜爽天天爽三区 | 久久99精品国产麻豆蜜芽 | 亚洲欧美国产精品专区久久 | 久久久久亚洲精品中文字幕 | 男人的天堂av网站 | 国语精品一区二区三区 | 永久黄网站色视频免费直播 | 人妻尝试又大又粗久久 | 日本va欧美va欧美va精品 | 强奷人妻日本中文字幕 | 国产真实乱对白精彩久久 | 日日橹狠狠爱欧美视频 | 亚洲乱码国产乱码精品精 | 精品乱码久久久久久久 | 国内精品九九久久久精品 | 97久久精品无码一区二区 | 久久久精品成人免费观看 | 国产无遮挡吃胸膜奶免费看 | 99精品无人区乱码1区2区3区 | 男人和女人高潮免费网站 | 亚拍精品一区二区三区探花 | 一本久道久久综合狠狠爱 | 无码人妻黑人中文字幕 | 欧美三级不卡在线观看 | 中文字幕人妻无码一夲道 | 又紧又大又爽精品一区二区 | 日本一区二区三区免费高清 | 性生交大片免费看女人按摩摩 | 99久久精品午夜一区二区 | 欧美日韩一区二区三区自拍 | 欧美 亚洲 国产 另类 | 国内老熟妇对白xxxxhd | 中文无码精品a∨在线观看不卡 | 在线成人www免费观看视频 | 久久久久成人片免费观看蜜芽 | yw尤物av无码国产在线观看 | 特黄特色大片免费播放器图片 | 天堂а√在线地址中文在线 | 国产成人人人97超碰超爽8 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产在线精品一区二区高清不卡 | 任你躁国产自任一区二区三区 | 久久精品一区二区三区四区 | 亚洲人成网站色7799 | 99精品无人区乱码1区2区3区 | 久久成人a毛片免费观看网站 | 人妻中文无码久热丝袜 | 色五月丁香五月综合五月 | 中文字幕久久久久人妻 | 婷婷色婷婷开心五月四房播播 | 亚洲综合伊人久久大杳蕉 | 精品熟女少妇av免费观看 | 精品aⅴ一区二区三区 | 日日摸天天摸爽爽狠狠97 | 黑森林福利视频导航 | 俺去俺来也在线www色官网 | 国产农村妇女高潮大叫 | 九月婷婷人人澡人人添人人爽 | 秋霞成人午夜鲁丝一区二区三区 | 免费中文字幕日韩欧美 | 久久久久久亚洲精品a片成人 | 日本精品高清一区二区 | 性生交大片免费看女人按摩摩 | 国产又爽又黄又刺激的视频 | 天天摸天天透天天添 | 久久久精品国产sm最大网站 | 精品国产麻豆免费人成网站 | 国产精品久久久久9999小说 | 日韩精品无码一本二本三本色 | 日本一卡2卡3卡四卡精品网站 | 亚洲欧美中文字幕5发布 | 377p欧洲日本亚洲大胆 | 亚洲人成网站在线播放942 | 中文无码伦av中文字幕 | 亚洲熟悉妇女xxx妇女av | 亚洲中文字幕在线无码一区二区 | 中文字幕av日韩精品一区二区 | 色窝窝无码一区二区三区色欲 | 乱人伦人妻中文字幕无码久久网 | 日本乱人伦片中文三区 | 久久国内精品自在自线 | 亚洲伊人久久精品影院 | 性色av无码免费一区二区三区 | 亚洲毛片av日韩av无码 | 97夜夜澡人人双人人人喊 | 久久99久久99精品中文字幕 | 国产一区二区三区四区五区加勒比 | 性欧美牲交在线视频 | 樱花草在线社区www | 久久久中文久久久无码 | 人人妻人人澡人人爽精品欧美 | 欧美精品在线观看 | 无码吃奶揉捏奶头高潮视频 | 久9re热视频这里只有精品 | 亚洲色成人中文字幕网站 | 国内精品久久毛片一区二区 | 国产成人无码av在线影院 | 国产精品无码成人午夜电影 | 久久精品女人天堂av免费观看 | 青草视频在线播放 | 在线观看欧美一区二区三区 | 丰满肥臀大屁股熟妇激情视频 | 国产内射老熟女aaaa | 无码人妻少妇伦在线电影 | 欧美国产日产一区二区 | 国产小呦泬泬99精品 | 国产人妖乱国产精品人妖 | 狠狠亚洲超碰狼人久久 | 波多野结衣aⅴ在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 国内少妇偷人精品视频 | 色诱久久久久综合网ywww | 精品国产一区二区三区四区在线看 | 又大又硬又爽免费视频 | 色综合久久久无码网中文 | 在线播放亚洲第一字幕 | 精品无人国产偷自产在线 | 综合人妻久久一区二区精品 | 中文字幕av伊人av无码av | 99er热精品视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产热a欧美热a在线视频 | 88国产精品欧美一区二区三区 | 日本xxxx色视频在线观看免费 | 奇米影视7777久久精品人人爽 | 天天摸天天碰天天添 | 色五月丁香五月综合五月 | 狂野欧美性猛xxxx乱大交 | 亚洲国产精品无码久久久久高潮 | 国产97色在线 | 免 | 黑人粗大猛烈进出高潮视频 | 久久99精品久久久久久动态图 | 国产免费久久久久久无码 | 欧美日韩色另类综合 | 蜜桃臀无码内射一区二区三区 | 鲁大师影院在线观看 | 久久精品人妻少妇一区二区三区 | 少妇一晚三次一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 熟妇人妻无码xxx视频 | 欧美真人作爱免费视频 | 宝宝好涨水快流出来免费视频 | 老熟妇仑乱视频一区二区 | 小sao货水好多真紧h无码视频 | 亚洲成a人一区二区三区 | www国产亚洲精品久久网站 | 国产超碰人人爽人人做人人添 | 精品亚洲韩国一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 激情内射亚州一区二区三区爱妻 | 亚洲成熟女人毛毛耸耸多 | 国产精品久久久久久无码 | 精品久久久久久亚洲精品 | 精品日本一区二区三区在线观看 | 欧美午夜特黄aaaaaa片 | 国内精品久久毛片一区二区 | 久久久国产精品无码免费专区 | 天堂а√在线中文在线 | 亚洲国产综合无码一区 | 亚洲色成人中文字幕网站 | 伊人久久大香线蕉亚洲 | 国产综合久久久久鬼色 | 性生交大片免费看女人按摩摩 | 一本久久a久久精品vr综合 | 六月丁香婷婷色狠狠久久 | 国产xxx69麻豆国语对白 | 麻豆果冻传媒2021精品传媒一区下载 | 日日天日日夜日日摸 | 无码av中文字幕免费放 | 狠狠躁日日躁夜夜躁2020 | 少妇高潮一区二区三区99 | 亚洲阿v天堂在线 | 精品无人区无码乱码毛片国产 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | av无码久久久久不卡免费网站 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产午夜无码视频在线观看 | 97精品国产97久久久久久免费 | 无码av中文字幕免费放 | 精品少妇爆乳无码av无码专区 | 亚洲国产精品成人久久蜜臀 | 国产成人综合美国十次 | 人妻互换免费中文字幕 | 一个人看的www免费视频在线观看 | 少妇人妻av毛片在线看 | 日本精品久久久久中文字幕 | 国产精品美女久久久 | 欧美一区二区三区视频在线观看 | 久久国产精品萌白酱免费 | 国产一区二区三区四区五区加勒比 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲精品综合一区二区三区在线 | 日本高清一区免费中文视频 | 一二三四在线观看免费视频 | 鲁一鲁av2019在线 | 乱码av麻豆丝袜熟女系列 | 色偷偷人人澡人人爽人人模 | 国产亚洲精品久久久闺蜜 | 欧美 丝袜 自拍 制服 另类 | 小泽玛莉亚一区二区视频在线 | 国产精品久久久久9999小说 | 久久综合狠狠综合久久综合88 | 亚洲精品www久久久 | 天堂а√在线中文在线 | 婷婷五月综合激情中文字幕 | 日日摸日日碰夜夜爽av | 欧美35页视频在线观看 | 小鲜肉自慰网站xnxx | 老熟女重囗味hdxx69 | 国内揄拍国内精品人妻 | 亚洲自偷自拍另类第1页 | 熟女少妇在线视频播放 | 亚洲另类伦春色综合小说 | 精品国产精品久久一区免费式 | 国内精品人妻无码久久久影院 | 久久久久久亚洲精品a片成人 | 久久人人爽人人人人片 | 欧美国产日韩久久mv | 我要看www免费看插插视频 | 亚洲国产精品久久久久久 | 高清国产亚洲精品自在久久 | 欧美性黑人极品hd | 久久综合给合久久狠狠狠97色 | 成人亚洲精品久久久久软件 | 少妇人妻大乳在线视频 | 97精品国产97久久久久久免费 | 日韩人妻无码一区二区三区久久99 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 天堂无码人妻精品一区二区三区 | 精品无码国产自产拍在线观看蜜 | 亚洲综合伊人久久大杳蕉 | 亚洲国产精品无码久久久久高潮 | 中文字幕乱妇无码av在线 | 国产情侣作爱视频免费观看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 激情国产av做激情国产爱 | 麻豆精产国品 | 人妻无码αv中文字幕久久琪琪布 | 欧美 亚洲 国产 另类 | 亚洲国产精品无码久久久久高潮 | 亚洲精品久久久久久一区二区 | 亚洲成av人在线观看网址 | 噜噜噜亚洲色成人网站 | 精品人妻中文字幕有码在线 | 日韩精品一区二区av在线 | 色综合天天综合狠狠爱 | 久久久久国色av免费观看性色 | 乱码av麻豆丝袜熟女系列 | 亚洲色在线无码国产精品不卡 | 国产在线无码精品电影网 | 日本一区二区三区免费高清 | 中文字幕无码视频专区 | 婷婷综合久久中文字幕蜜桃三电影 | 无码国产乱人伦偷精品视频 | 高清国产亚洲精品自在久久 | 日本又色又爽又黄的a片18禁 | 中文字幕亚洲情99在线 | 亚洲成av人影院在线观看 | 午夜无码人妻av大片色欲 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品www久久久 | 少妇性俱乐部纵欲狂欢电影 | 亚洲成熟女人毛毛耸耸多 | 午夜理论片yy44880影院 | 久久精品成人欧美大片 | 久久人妻内射无码一区三区 | 国产乱人伦av在线无码 | 7777奇米四色成人眼影 | 性生交大片免费看女人按摩摩 | 18禁黄网站男男禁片免费观看 | 精品无码av一区二区三区 | 99精品无人区乱码1区2区3区 | 久久亚洲中文字幕精品一区 | 国产肉丝袜在线观看 | 国产又爽又猛又粗的视频a片 | 色狠狠av一区二区三区 | 色综合久久中文娱乐网 | 99麻豆久久久国产精品免费 | 亚洲精品综合五月久久小说 | 欧美成人午夜精品久久久 | 国产美女精品一区二区三区 | 久久久无码中文字幕久... | 久久久精品欧美一区二区免费 | 波多野42部无码喷潮在线 | 日日橹狠狠爱欧美视频 | 亚洲精品国产第一综合99久久 | 无码av中文字幕免费放 | 性色欲情网站iwww九文堂 | 97久久国产亚洲精品超碰热 | 国产精品久久久久影院嫩草 | 未满小14洗澡无码视频网站 | 亚洲s色大片在线观看 | 亚洲中文字幕无码一久久区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 麻豆人妻少妇精品无码专区 | 国产真实伦对白全集 | 午夜福利电影 | 亚洲 高清 成人 动漫 | 乱人伦人妻中文字幕无码久久网 | 日本精品人妻无码免费大全 | 99久久人妻精品免费二区 | 蜜桃视频韩日免费播放 | 欧美大屁股xxxxhd黑色 | 少妇邻居内射在线 | 无码国产乱人伦偷精品视频 | 国产精品va在线观看无码 | 中文字幕av无码一区二区三区电影 | 性欧美熟妇videofreesex | 成人精品视频一区二区 | 国产激情一区二区三区 | 九月婷婷人人澡人人添人人爽 | 国产精品多人p群无码 | 国产真人无遮挡作爱免费视频 | 无码国模国产在线观看 | 99国产精品白浆在线观看免费 | 欧洲极品少妇 | 77777熟女视频在线观看 а天堂中文在线官网 | 精品久久久久久亚洲精品 | 六月丁香婷婷色狠狠久久 | 在线亚洲高清揄拍自拍一品区 | 暴力强奷在线播放无码 | 激情亚洲一区国产精品 | 7777奇米四色成人眼影 | 精品乱码久久久久久久 | 久久97精品久久久久久久不卡 | 国产精品国产自线拍免费软件 | 亚洲精品美女久久久久久久 | 亚洲s码欧洲m码国产av | 无码国产乱人伦偷精品视频 | 波多野结衣乳巨码无在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 福利一区二区三区视频在线观看 | 中文字幕乱码中文乱码51精品 | 日本一卡二卡不卡视频查询 | 国产97人人超碰caoprom | 影音先锋中文字幕无码 | 精品国产一区二区三区四区在线看 | 精品成人av一区二区三区 | 人人妻人人澡人人爽欧美一区 | 国内精品人妻无码久久久影院蜜桃 | 国产精品手机免费 | 99国产精品白浆在线观看免费 | 狂野欧美性猛交免费视频 | 人妻少妇精品视频专区 | 久久人人爽人人爽人人片av高清 | 美女张开腿让人桶 | 国产精品久久国产精品99 | 丰满岳乱妇在线观看中字无码 | 亚洲另类伦春色综合小说 | 青青青手机频在线观看 | 午夜精品久久久久久久久 | 成人无码影片精品久久久 | 中文字幕精品av一区二区五区 | 国产xxx69麻豆国语对白 | √天堂资源地址中文在线 | 一本久久伊人热热精品中文字幕 | 人人爽人人澡人人高潮 | 成熟人妻av无码专区 | 麻豆人妻少妇精品无码专区 | 天天摸天天透天天添 | 欧美野外疯狂做受xxxx高潮 | 天天拍夜夜添久久精品大 | 亚洲精品一区二区三区在线 | 国产精品亚洲专区无码不卡 | 女人被爽到呻吟gif动态图视看 | 99精品视频在线观看免费 | 中文字幕 亚洲精品 第1页 | 婷婷综合久久中文字幕蜜桃三电影 | 国产片av国语在线观看 | 欧美日韩在线亚洲综合国产人 | 18禁黄网站男男禁片免费观看 | a片在线免费观看 | 免费人成网站视频在线观看 | 国产激情一区二区三区 | 色欲人妻aaaaaaa无码 | 亚洲成av人片天堂网无码】 | 日韩在线不卡免费视频一区 | 无码av岛国片在线播放 | 国产内射老熟女aaaa | 无码毛片视频一区二区本码 | 丁香啪啪综合成人亚洲 | 色综合久久久无码中文字幕 | 欧美成人家庭影院 | 亚洲va欧美va天堂v国产综合 | 欧美 日韩 人妻 高清 中文 | 欧美色就是色 | 免费无码的av片在线观看 | 国产后入清纯学生妹 | 永久免费观看美女裸体的网站 | 久久久中文久久久无码 | 国产精品多人p群无码 | 欧美高清在线精品一区 | 久久综合九色综合97网 | 欧美 日韩 亚洲 在线 | 成人aaa片一区国产精品 | 玩弄少妇高潮ⅹxxxyw | 日日橹狠狠爱欧美视频 | 婷婷色婷婷开心五月四房播播 | 久久午夜无码鲁丝片秋霞 | 国精产品一区二区三区 | 乌克兰少妇性做爰 | 欧美成人高清在线播放 | 久久久久久久女国产乱让韩 | 东京热无码av男人的天堂 | 久久精品99久久香蕉国产色戒 | 377p欧洲日本亚洲大胆 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 激情内射日本一区二区三区 | 18禁黄网站男男禁片免费观看 | 亚洲综合另类小说色区 | 激情内射日本一区二区三区 | 99久久婷婷国产综合精品青草免费 | 亚洲乱码国产乱码精品精 | 老子影院午夜伦不卡 | 亚洲精品国偷拍自产在线观看蜜桃 | 蜜桃视频插满18在线观看 | 性欧美videos高清精品 | 俺去俺来也www色官网 | √天堂资源地址中文在线 | 7777奇米四色成人眼影 | 国产卡一卡二卡三 | 国产乱码精品一品二品 | 狂野欧美性猛交免费视频 | 无遮挡国产高潮视频免费观看 | 成在人线av无码免费 | 久久久精品456亚洲影院 | 任你躁在线精品免费 | 国产精品理论片在线观看 | 国产后入清纯学生妹 | 亚洲人成影院在线观看 | 97精品国产97久久久久久免费 | 亚洲欧美日韩成人高清在线一区 | 国语精品一区二区三区 | 蜜桃av抽搐高潮一区二区 | 樱花草在线播放免费中文 | 免费视频欧美无人区码 | 乌克兰少妇性做爰 | 麻花豆传媒剧国产免费mv在线 | 又大又紧又粉嫩18p少妇 | 日本免费一区二区三区最新 | 88国产精品欧美一区二区三区 | 久久99精品国产.久久久久 | 天天躁日日躁狠狠躁免费麻豆 | 红桃av一区二区三区在线无码av | 亚洲一区二区三区播放 | 欧美国产日产一区二区 | 天天躁日日躁狠狠躁免费麻豆 | 国产国产精品人在线视 | 中文字幕+乱码+中文字幕一区 | 成人aaa片一区国产精品 | 日韩 欧美 动漫 国产 制服 | 给我免费的视频在线观看 | 欧美高清在线精品一区 | 夫妻免费无码v看片 | 无码毛片视频一区二区本码 | 色综合久久久无码网中文 | 亚洲精品国产第一综合99久久 | 男女性色大片免费网站 | 少妇的肉体aa片免费 | 精品人妻中文字幕有码在线 | 国产乱人伦偷精品视频 | 中文字幕 亚洲精品 第1页 | 国产精品a成v人在线播放 | 欧美国产日产一区二区 | 亚洲啪av永久无码精品放毛片 | 亚洲欧美日韩综合久久久 | 永久免费观看国产裸体美女 | 丰满少妇高潮惨叫视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲色在线无码国产精品不卡 | 熟妇人妻中文av无码 | 亚洲国产高清在线观看视频 | 国产无套内射久久久国产 | 亚洲色在线无码国产精品不卡 | 黑人大群体交免费视频 | 无码人妻丰满熟妇区毛片18 | 日日碰狠狠躁久久躁蜜桃 | 国产在线精品一区二区三区直播 | 色狠狠av一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 久久99久久99精品中文字幕 | 99久久久国产精品无码免费 | 丰满少妇人妻久久久久久 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕av日韩精品一区二区 | 日本www一道久久久免费榴莲 | 久久精品视频在线看15 | 亚洲国产精品无码一区二区三区 | 亚洲成色www久久网站 | 亚洲小说图区综合在线 | 精品一区二区不卡无码av | 熟妇人妻无码xxx视频 | 国产农村乱对白刺激视频 | 久久精品一区二区三区四区 | 国内综合精品午夜久久资源 | 性史性农村dvd毛片 | 久久久亚洲欧洲日产国码αv | 国内精品人妻无码久久久影院蜜桃 | 人妻插b视频一区二区三区 | 日本护士xxxxhd少妇 | 综合激情五月综合激情五月激情1 | 午夜丰满少妇性开放视频 | 樱花草在线社区www | 日日麻批免费40分钟无码 | 人人妻在人人 | 国产肉丝袜在线观看 | 亚洲综合色区中文字幕 | 亚洲va欧美va天堂v国产综合 | 中文字幕无码日韩欧毛 | 亚洲人成无码网www | 女人被爽到呻吟gif动态图视看 | 亚洲色偷偷偷综合网 | 99国产精品白浆在线观看免费 | 51国偷自产一区二区三区 | 欧美人与物videos另类 | 亚洲中文字幕在线无码一区二区 | av无码电影一区二区三区 | 中文字幕日产无线码一区 | 亚洲国产欧美国产综合一区 | 欧美阿v高清资源不卡在线播放 | 亚洲人成影院在线无码按摩店 | 亚洲呦女专区 | 国产精品亚洲一区二区三区喷水 | 欧美成人家庭影院 | 亚洲精品一区二区三区婷婷月 | 亚洲精品午夜无码电影网 | 搡女人真爽免费视频大全 | 中文字幕av伊人av无码av | 久久97精品久久久久久久不卡 | 天堂а√在线中文在线 | 国产精品久久久久久久9999 | 亚洲高清偷拍一区二区三区 | 国产日产欧产精品精品app | 女人被爽到呻吟gif动态图视看 | 精品国产青草久久久久福利 | 国产精品久久久久久久影院 | 欧美成人高清在线播放 | 久久99精品久久久久婷婷 | 99久久精品无码一区二区毛片 | 丰腴饱满的极品熟妇 | 日韩欧美群交p片內射中文 | 扒开双腿吃奶呻吟做受视频 | 国内老熟妇对白xxxxhd | 国产亚洲日韩欧美另类第八页 | 两性色午夜免费视频 | 欧美放荡的少妇 | 鲁大师影院在线观看 | 激情亚洲一区国产精品 | 动漫av一区二区在线观看 | 国精产品一区二区三区 | 无码毛片视频一区二区本码 | 少妇性荡欲午夜性开放视频剧场 | 中文亚洲成a人片在线观看 | 亚洲自偷精品视频自拍 | 色综合久久久无码网中文 | 大肉大捧一进一出好爽视频 | 久久综合给久久狠狠97色 | 国产午夜福利100集发布 | 日韩欧美中文字幕公布 | 国产精品欧美成人 | 狠狠色欧美亚洲狠狠色www | 亚洲色欲久久久综合网东京热 | 少妇无码一区二区二三区 | 成熟女人特级毛片www免费 | 日韩无码专区 | 一本色道久久综合亚洲精品不卡 | 亚洲s码欧洲m码国产av | 1000部夫妻午夜免费 | 亚洲日韩av一区二区三区四区 | 久青草影院在线观看国产 | 人人超人人超碰超国产 | 亚洲人成网站在线播放942 | 国产精品亚洲五月天高清 | 久久国内精品自在自线 | 日日摸日日碰夜夜爽av | 野外少妇愉情中文字幕 | 97久久超碰中文字幕 | 国产免费观看黄av片 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧美日韩一区二区三区自拍 | 日产精品高潮呻吟av久久 | 在线播放免费人成毛片乱码 | 亚洲国产精品毛片av不卡在线 | 狠狠躁日日躁夜夜躁2020 | 狠狠色噜噜狠狠狠狠7777米奇 | 少妇无套内谢久久久久 | 人妻互换免费中文字幕 | 精品熟女少妇av免费观看 | 日本免费一区二区三区最新 | 日本在线高清不卡免费播放 | 国产精品久免费的黄网站 | 少妇久久久久久人妻无码 | 国产精品成人av在线观看 | 内射老妇bbwx0c0ck | 国产av一区二区三区最新精品 | 爆乳一区二区三区无码 | 国产乱人伦av在线无码 | 中文字幕日韩精品一区二区三区 | 好男人www社区 | 曰韩少妇内射免费播放 | 久青草影院在线观看国产 | 国产麻豆精品一区二区三区v视界 | 精品水蜜桃久久久久久久 | 牲交欧美兽交欧美 | 日本爽爽爽爽爽爽在线观看免 | 久久精品国产一区二区三区肥胖 | 夜夜躁日日躁狠狠久久av | 漂亮人妻洗澡被公强 日日躁 | 精品国产一区av天美传媒 | 久久综合久久自在自线精品自 | 丰满妇女强制高潮18xxxx | 国产精品无码mv在线观看 | 亚洲成a人片在线观看无码3d | 丰满少妇熟乱xxxxx视频 | 亚洲阿v天堂在线 | 亚洲欧美综合区丁香五月小说 | 无码人妻av免费一区二区三区 | 成人免费视频一区二区 | 黑人粗大猛烈进出高潮视频 | 中文字幕无码日韩欧毛 | www一区二区www免费 | 亚洲综合另类小说色区 | 熟妇人妻无码xxx视频 | 国产熟女一区二区三区四区五区 | 日韩人妻系列无码专区 | 成年美女黄网站色大免费全看 | 国产精品无码永久免费888 | 久久亚洲中文字幕精品一区 | 欧美老熟妇乱xxxxx | 国产成人无码区免费内射一片色欲 | 久久99精品久久久久久动态图 | 5858s亚洲色大成网站www | 亚洲国产成人a精品不卡在线 | 玩弄中年熟妇正在播放 | 日韩亚洲欧美精品综合 | 国产亚av手机在线观看 | 99久久99久久免费精品蜜桃 | 婷婷丁香六月激情综合啪 | 久久99久久99精品中文字幕 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲日韩精品欧美一区二区 | 激情爆乳一区二区三区 | 久久久久亚洲精品男人的天堂 | 亚洲а∨天堂久久精品2021 | 无码人妻丰满熟妇区五十路百度 | 精品国产精品久久一区免费式 | 狠狠色欧美亚洲狠狠色www | 亚洲精品午夜无码电影网 | 无码国产色欲xxxxx视频 | 天堂无码人妻精品一区二区三区 | 亚洲男人av香蕉爽爽爽爽 | 日本在线高清不卡免费播放 | 玩弄少妇高潮ⅹxxxyw | 2020久久超碰国产精品最新 | 对白脏话肉麻粗话av | 日本一卡2卡3卡四卡精品网站 | 国产精品自产拍在线观看 | 中文字幕无码热在线视频 | 亚欧洲精品在线视频免费观看 | 国产av久久久久精东av | 樱花草在线社区www | 桃花色综合影院 | 亚洲 日韩 欧美 成人 在线观看 | 日本大乳高潮视频在线观看 | 亚洲综合另类小说色区 | 一本色道久久综合狠狠躁 | 午夜精品一区二区三区的区别 | 免费播放一区二区三区 | 性欧美熟妇videofreesex | 精品欧美一区二区三区久久久 | 久久精品国产精品国产精品污 | 人妻少妇被猛烈进入中文字幕 | 国产精品亚洲一区二区三区喷水 | 国产午夜福利亚洲第一 | 任你躁在线精品免费 | 成人精品视频一区二区 | 国产精品久久久久久亚洲毛片 | 亚洲欧洲中文日韩av乱码 | 人人妻人人澡人人爽欧美一区 | 国产乱码精品一品二品 | 一二三四社区在线中文视频 | 亚洲精品久久久久久久久久久 | 亚洲综合无码久久精品综合 | 乱人伦人妻中文字幕无码 | 少妇高潮喷潮久久久影院 | 久久亚洲中文字幕精品一区 | 东京热无码av男人的天堂 | 亚洲人成网站免费播放 | 国产亚洲美女精品久久久2020 | 高清不卡一区二区三区 | 男女超爽视频免费播放 | 全球成人中文在线 | 欧洲vodafone精品性 | 国产精品久久久一区二区三区 | 老熟女重囗味hdxx69 | 亚洲一区二区三区播放 | 少妇无码av无码专区在线观看 | 香港三级日本三级妇三级 | 精品成人av一区二区三区 | 亚洲va中文字幕无码久久不卡 | 桃花色综合影院 | 少妇人妻av毛片在线看 | 国产午夜视频在线观看 | 久久综合色之久久综合 | 爆乳一区二区三区无码 | 亚洲精品成人av在线 | 国产成人无码a区在线观看视频app | 无码人妻出轨黑人中文字幕 | 久久久久久久久888 | 中文字幕人妻无码一夲道 | 人妻中文无码久热丝袜 | 天天综合网天天综合色 | 国产一区二区三区四区五区加勒比 | 国精品人妻无码一区二区三区蜜柚 | 少妇无码一区二区二三区 | 精品欧洲av无码一区二区三区 | 久久99精品久久久久久 | 蜜臀av无码人妻精品 | 日日噜噜噜噜夜夜爽亚洲精品 | 无码毛片视频一区二区本码 | 亲嘴扒胸摸屁股激烈网站 | 久久综合久久自在自线精品自 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产成人av免费观看 | 精品国产精品久久一区免费式 | 夜夜高潮次次欢爽av女 | 亚洲va欧美va天堂v国产综合 | 人人澡人人妻人人爽人人蜜桃 | 扒开双腿吃奶呻吟做受视频 | 色偷偷人人澡人人爽人人模 | 成在人线av无码免观看麻豆 | 一本无码人妻在中文字幕免费 | 亚洲a无码综合a国产av中文 | 国产精品永久免费视频 | 亚洲成a人一区二区三区 | 欧美 丝袜 自拍 制服 另类 | 日韩在线不卡免费视频一区 | 亚洲自偷自拍另类第1页 | 国产舌乚八伦偷品w中 | 美女张开腿让人桶 | 国产午夜亚洲精品不卡下载 | 欧美老妇与禽交 | 国内老熟妇对白xxxxhd | 少妇无码吹潮 | 黑人玩弄人妻中文在线 | 麻豆人妻少妇精品无码专区 | 国产精品久久精品三级 | 国产香蕉尹人综合在线观看 | 亚洲 a v无 码免 费 成 人 a v | 中文字幕日韩精品一区二区三区 | 蜜桃视频插满18在线观看 | 永久免费精品精品永久-夜色 | 国产激情精品一区二区三区 | 成人动漫在线观看 | 欧美黑人性暴力猛交喷水 | 夜夜躁日日躁狠狠久久av | 日本护士毛茸茸高潮 | 98国产精品综合一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 国产超级va在线观看视频 | 亚洲欧美精品aaaaaa片 | 国产麻豆精品精东影业av网站 | 亚洲精品一区二区三区在线观看 | 99精品视频在线观看免费 | 97人妻精品一区二区三区 | 丰满少妇弄高潮了www | 日韩人妻少妇一区二区三区 | 亚洲经典千人经典日产 | 久久久国产一区二区三区 | 欧美成人高清在线播放 | 55夜色66夜色国产精品视频 | 久青草影院在线观看国产 | 麻豆人妻少妇精品无码专区 | 日韩精品a片一区二区三区妖精 | 3d动漫精品啪啪一区二区中 | 精品久久久久久亚洲精品 | 永久免费精品精品永久-夜色 | 免费观看又污又黄的网站 | 国产性生交xxxxx无码 | 亚洲精品国产精品乱码不卡 | 丰满少妇高潮惨叫视频 | 国产一区二区三区影院 | 超碰97人人射妻 | 免费观看的无遮挡av | 精品人妻人人做人人爽夜夜爽 | 内射巨臀欧美在线视频 | 97资源共享在线视频 | 国内少妇偷人精品视频 | 伊人久久婷婷五月综合97色 | 欧美丰满老熟妇xxxxx性 | 双乳奶水饱满少妇呻吟 | 国产69精品久久久久app下载 | 亚洲第一网站男人都懂 | 中文无码成人免费视频在线观看 | 自拍偷自拍亚洲精品10p | 男女下面进入的视频免费午夜 | 捆绑白丝粉色jk震动捧喷白浆 | 性做久久久久久久免费看 | 老子影院午夜伦不卡 | 日韩无套无码精品 | 亚洲色欲色欲天天天www | 99精品视频在线观看免费 | 天天爽夜夜爽夜夜爽 | 青青久在线视频免费观看 | 日韩av无码中文无码电影 | 青草青草久热国产精品 | 麻豆蜜桃av蜜臀av色欲av | 日日天干夜夜狠狠爱 | 亚洲欧美色中文字幕在线 | 亚洲色欲色欲天天天www | 天堂在线观看www | 久久久久久久人妻无码中文字幕爆 | 国产极品视觉盛宴 | 亚洲 a v无 码免 费 成 人 a v | 欧洲vodafone精品性 | 欧美 丝袜 自拍 制服 另类 | 日韩精品一区二区av在线 | 人人妻人人澡人人爽欧美精品 | 亚洲日韩av片在线观看 | 国产精品va在线观看无码 | 无码av岛国片在线播放 | 欧美zoozzooz性欧美 | 在线亚洲高清揄拍自拍一品区 | 女人被男人躁得好爽免费视频 | 少妇性荡欲午夜性开放视频剧场 | 国产精品久久久av久久久 | 一区二区传媒有限公司 | 精品人妻中文字幕有码在线 | 双乳奶水饱满少妇呻吟 | 国产成人综合色在线观看网站 | 成人动漫在线观看 | 欧美放荡的少妇 | 狠狠色丁香久久婷婷综合五月 | 色一情一乱一伦一区二区三欧美 | 欧美日本精品一区二区三区 | 一个人看的www免费视频在线观看 | 亚洲中文字幕无码一久久区 | 欧美人与牲动交xxxx | 精品一区二区三区无码免费视频 | 无码人妻久久一区二区三区不卡 | 丰满岳乱妇在线观看中字无码 | 国产精华av午夜在线观看 | 老司机亚洲精品影院无码 | 嫩b人妻精品一区二区三区 | 久久这里只有精品视频9 | 日本护士毛茸茸高潮 | 无码av免费一区二区三区试看 | 久青草影院在线观看国产 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 强伦人妻一区二区三区视频18 | 又色又爽又黄的美女裸体网站 | 精品午夜福利在线观看 | 久久综合网欧美色妞网 | 思思久久99热只有频精品66 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲精品成人福利网站 | 国产成人无码一二三区视频 | 综合人妻久久一区二区精品 | 大地资源中文第3页 | 国产精品二区一区二区aⅴ污介绍 | 乌克兰少妇xxxx做受 | 日本成熟视频免费视频 | 成熟人妻av无码专区 | 成人亚洲精品久久久久 | 久久精品人人做人人综合试看 | 两性色午夜免费视频 | 亚洲乱亚洲乱妇50p | 在线看片无码永久免费视频 | 荫蒂被男人添的好舒服爽免费视频 | 欧美色就是色 | 性欧美牲交xxxxx视频 | 国产精品亚洲五月天高清 | 精品国产国产综合精品 | 三级4级全黄60分钟 | 亚洲乱码日产精品bd | 国产超碰人人爽人人做人人添 | 欧美成人高清在线播放 | 麻豆av传媒蜜桃天美传媒 | 国产精品亚洲一区二区三区喷水 | 在线播放亚洲第一字幕 | 玩弄少妇高潮ⅹxxxyw | 精品久久8x国产免费观看 | 欧美老人巨大xxxx做受 | 久久精品人人做人人综合 | 3d动漫精品啪啪一区二区中 | 精品无码一区二区三区的天堂 | 亚洲一区二区三区无码久久 | 国产激情艳情在线看视频 | 中文字幕乱码亚洲无线三区 | 免费乱码人妻系列无码专区 | 麻豆国产人妻欲求不满 | 国产莉萝无码av在线播放 | 最近的中文字幕在线看视频 |