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

用JavaEE7、Websockets和GlassFish4打造聊天室(一)

譯文
開發 后端
Java EE 7已經在今年正式發布了,新增加了很多新的功能和特性,如新增或更新了不少的JSR標準。其中特別受到關注的是Websockets。它的一個好處之一是減少了不必要的網絡流量。它主要是用于在客戶機和服務器之間建立單一的雙向連接。

Java EE 7已經在今年正式發布了,新增加了很多新的功能和特性,如新增或更新了不少的JSR標準。其中特別受到關注的是Websockets。它的一個好處之一是減少了不必要的網絡流量。它主要是用于在客戶機和服務器之間建立單一的雙向連接。這意味著客戶只需要發送一個請求到服務端,那么服務端則會進行處理,處理好后則將其返回給客戶端,客戶端則可以在等待這個時間繼續去做其他工作,整個過程是異步的。在本系列教程中,將指導用戶如何在JAVA EE 7的容器GlassFish 4中,使用JAVA EE 7中的全新的解析Json API(JSR-353),以及綜合運用jQuery和Bootstrap。本文要求讀者有一定的HTML 5 Websocket的基礎原理知識。

效果圖

我們先來看下在完成這個教程后的效果圖,如下所示:

準備工作

我們使用的是JDK 7 和MAVN 3進行庫的構建工作,首先看pom.xml中關于Jave EE 7的部分:

  1.  <properties> 
  2.     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
  3.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
  4. </properties> 
  5.   
  6. <dependencies> 
  7.     <dependency> 
  8.         <groupId>javax</groupId> 
  9.         <artifactId>javaee-api</artifactId> 
  10.         <version>7.0</version> 
  11.         <scope>provided</scope> 
  12.     </dependency> 
  13. </dependencies> 
  14.   
  15. <build> 
  16.     <plugins> 
  17.         <plugin> 
  18.             <groupId>org.apache.maven.plugins</groupId> 
  19.             <artifactId>maven-compiler-plugin</artifactId> 
  20.             <version>3.1</version> 
  21.             <configuration> 
  22.                 <source>1.7</source> 
  23.                 <target>1.7</target> 
  24.                 <compilerArguments> 
  25.                     <endorseddirs>${endorsed.dir}</endorseddirs> 
  26.                 </compilerArguments> 
  27.             </configuration> 
  28.         </plugin> 
  29.         <plugin> 
  30.             <groupId>org.apache.maven.plugins</groupId> 
  31.             <artifactId>maven-war-plugin</artifactId> 
  32.             <version>2.3</version> 
  33.             <configuration> 
  34.                 <failOnMissingWebXml>false</failOnMissingWebXml> 
  35.             </configuration> 
  36.         </plugin> 
  37.         <plugin> 
  38.             <groupId>org.apache.maven.plugins</groupId> 
  39.             <artifactId>maven-dependency-plugin</artifactId> 
  40.             <version>2.6</version> 
  41.             [..] 
  42.         </plugin> 
  43.     </plugins> 
  44. </build> 

同時,為了能使用GlassFish 4,需要增加如下的插件:

  1. plugin> 
  2.     <groupId>org.glassfish.embedded</groupId> 
  3.     <artifactId>maven-embedded-glassfish-plugin</artifactId> 
  4.     <version>4.0</version> 
  5.     <configuration> 
  6.         <goalPrefix>embedded-glassfish</goalPrefix> 
  7.         <app>${basedir}/target/${project.artifactId}-${project.version}.war</app> 
  8.         <autoDelete>true</autoDelete> 
  9.         <port>8080</port> 
  10.         <name>${project.artifactId}</name> 
  11.         <contextRoot>hascode</contextRoot> 
  12.     </configuration> 
  13.     <executions> 
  14.         <execution> 
  15.             <goals> 
  16.                 <goal>deploy</goal> 
  17.             </goals> 
  18.         </execution> 
  19.     </executions> 
  20. </plugin> 

設置Websocket的Endpoint

我們先來看服務端Websocket的代碼如下,然后再做進一步解析:

  1. package com.hascode.tutorial; 
  2.   
  3. import java.io.IOException; 
  4. import java.util.logging.Level; 
  5. import java.util.logging.Logger; 
  6.   
  7. import javax.websocket.EncodeException; 
  8. import javax.websocket.OnMessage; 
  9. import javax.websocket.OnOpen; 
  10. import javax.websocket.Session; 
  11. import javax.websocket.server.PathParam; 
  12. import javax.websocket.server.ServerEndpoint; 
  13.   
  14. @ServerEndpoint(value = "/chat/{room}", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class
  15. public class ChatEndpoint { 
  16.     private final Logger log = Logger.getLogger(getClass().getName()); 
  17.   
  18.     @OnOpen 
  19.     public void open(final Session session, @PathParam("room"final String room) { 
  20.         log.info("session openend and bound to room: " + room); 
  21.         session.getUserProperties().put("room", room); 
  22.     } 
  23.   
  24.     @OnMessage 
  25.     public void onMessage(final Session session, final ChatMessage chatMessage) { 
  26.         String room = (String) session.getUserProperties().get("room"); 
  27.         try { 
  28.             for (Session s : session.getOpenSessions()) { 
  29.                 if (s.isOpen() 
  30.                         && room.equals(s.getUserProperties().get("room"))) { 
  31.                     s.getBasicRemote().sendObject(chatMessage); 
  32.                 } 
  33.             } 
  34.         } catch (IOException | EncodeException e) { 
  35.             log.log(Level.WARNING, "onMessage failed", e); 
  36.         } 
  37.     } 

#p#

面分析下上面的代碼:

使用@ ServerEndpoint定義一個新的endpoint,其中的值指定了URL并且可以使用PathParams參數,就象在JAX-RS中的用法一樣。

所以值“/chat/{room}”允許用戶通過如下形式的URL去連接某個聊天室:ws://0.0.0.0:8080/hascode/chat/java

在大括號中的值(即room),可以通過使用javax.websocket.server.PathParam,在endpoint的生命周期回調方法中以參數的方式注入。

此外,我們要使用一個編碼和解碼的類,因為我們使用的是一個DTO形式的類,用于在服務端和客戶端傳送數據。

當用戶第一次連接到服務端,輸入要進入聊天室的房號,則這個房號以參數的方式注入提交,并且使用session.getUserProperties將值保存在用戶的屬性map中。

當一個聊天參與者通過tcp連接發送信息到服務端,則循環遍歷所有已打開的session,每個session被綁定到指定的聊天室中,并且接收編碼和解碼的信息。

如果我們想發送簡單的文本信息或和二進制格式的信息,則可以使用session.getBasicRemote().sendBinary() 或session.getBasicRemote().sendText()

接下來我們看下用于代表信息傳遞實體(DTO:Data Transfer Object)的代碼,如下:

  1. package com.hascode.tutorial; 
  2.   
  3. import java.util.Date; 
  4.   
  5. public class ChatMessage { 
  6.     private String message; 
  7.     private String sender; 
  8.     private Date received; 
  9.   
  10.     // 其他getter,setter方法 

聊天消息的轉換

在這個應用中,將編寫一個編碼和解碼類,用于在聊天信息和JSON格式間進行轉換。

先來看下解碼類的實現,這將會把傳遞到服務端的聊天信息轉換為ChatMessage實體類。在這里,使用的是Java API for JSON Processing(JSR353)(參考:

http://jcp.org/en/jsr/detail?id=353)規范去將JSON格式的信息轉換為實體類,代碼如下,其中重寫的willDecode方法,這里默認返回為true。

  1. package com.hascode.tutorial; 
  2.   
  3. import java.io.StringReader; 
  4. import java.util.Date; 
  5.   
  6. import javax.json.Json; 
  7. import javax.json.JsonObject; 
  8. import javax.websocket.DecodeException; 
  9. import javax.websocket.Decoder; 
  10. import javax.websocket.EndpointConfig; 
  11.   
  12. public class ChatMessageDecoder implements Decoder.Text<ChatMessage> { 
  13.     @Override 
  14.     public void init(final EndpointConfig config) { 
  15.     } 
  16.   
  17.     @Override 
  18.     public void destroy() { 
  19.     } 
  20.   
  21.     @Override 
  22.     public ChatMessage decode(final String textMessage) throws DecodeException { 
  23.         ChatMessage chatMessage = new ChatMessage(); 
  24.         JsonObject obj = Json.createReader(new StringReader(textMessage)) 
  25.                 .readObject(); 
  26.         chatMessage.setMessage(obj.getString("message")); 
  27.         chatMessage.setSender(obj.getString("sender")); 
  28.         chatMessage.setReceived(new Date()); 
  29.         return chatMessage; 
  30.     } 
  31.   
  32.     @Override 
  33.     public boolean willDecode(final String s) { 
  34.         return true
  35.     } 

同樣再看下編碼類的代碼,這個類相反,是將ChatMessage類轉換為Json格式,代碼如下:

  1. package com.hascode.tutorial; 
  2.   
  3. import javax.json.Json; 
  4. import javax.websocket.EncodeException; 
  5. import javax.websocket.Encoder; 
  6. import javax.websocket.EndpointConfig; 
  7.   
  8. public class ChatMessageEncoder implements Encoder.Text<ChatMessage> { 
  9.     @Override 
  10.     public void init(final EndpointConfig config) { 
  11.     } 
  12.   
  13.     @Override 
  14.     public void destroy() { 
  15.     } 
  16.   
  17.     @Override 
  18.     public String encode(final ChatMessage chatMessage) throws EncodeException { 
  19.         return Json.createObjectBuilder() 
  20.                 .add("message", chatMessage.getMessage()) 
  21.                 .add("sender", chatMessage.getSender()) 
  22.                 .add("received", chatMessage.getReceived().toString()).build() 
  23.                 .toString(); 
  24.     } 

這里可以看到JSR-353的強大威力,只需要調用Json.createObjectBuilder就可以輕易把一個DTO對象轉化為JSON了。

#p#

通過Bootstrap、Javacsript搭建簡易客戶端

最后,我們綜合運用著名的Bootstrap、jQuery框架和Javascript設計一個簡易的客戶端。我們在src/main/weapp目錄下新建立index.html文件,代碼如下:

  1. <!DOCTYPE html> 
  2. <html lang="en"> 
  3. <head> 
  4. [..] 
  5. <script> 
  6.     var wsocket; 
  7.     var serviceLocation = "ws://0.0.0.0:8080/hascode/chat/"
  8.     var $nickName; 
  9.     var $message; 
  10.     var $chatWindow; 
  11.     var room = ''
  12.   
  13.     function onMessageReceived(evt) { 
  14.         //var msg = eval('(' + evt.data + ')'); 
  15.         var msg = JSON.parse(evt.data); // native API 
  16.         var $messageLine = $('<tr><td class="received">' + msg.received 
  17.                 + '</td><td class="user label label-info">' + msg.sender 
  18.                 + '</td><td class="message badge">' + msg.message 
  19.                 + '</td></tr>'); 
  20.         $chatWindow.append($messageLine); 
  21.     } 
  22.     function sendMessage() { 
  23.         var msg = '{"message":"' + $message.val() + '", "sender":"' 
  24.                 + $nickName.val() + '", "received":""}'; 
  25.         wsocket.send(msg); 
  26.         $message.val('').focus(); 
  27.     } 
  28.   
  29.     function connectToChatserver() { 
  30.         room = $('#chatroom option:selected').val(); 
  31.         wsocket = new WebSocket(serviceLocation + room); 
  32.         wsocket.onmessage = onMessageReceived
  33.     } 
  34.   
  35.     function leaveRoom() { 
  36.         wsocket.close(); 
  37.         $chatWindow.empty(); 
  38.         $('.chat-wrapper').hide(); 
  39.         $('.chat-signin').show(); 
  40.         $nickName.focus(); 
  41.     } 
  42.   
  43.     $(document).ready(function() { 
  44.         $nickName = $('#nickname'); 
  45.         $message = $('#message'); 
  46.         $chatWindow = $('#response'); 
  47.         $('.chat-wrapper').hide(); 
  48.         $nickName.focus(); 
  49.   
  50.         $('#enterRoom').click(function(evt) { 
  51.             evt.preventDefault(); 
  52.             connectToChatserver(); 
  53.             $('.chat-wrapper h2').text('Chat # '+$nickName.val() + "@" + room); 
  54.             $('.chat-signin').hide(); 
  55.             $('.chat-wrapper').show(); 
  56.             $message.focus(); 
  57.         }); 
  58.         $('#do-chat').submit(function(evt) { 
  59.             evt.preventDefault(); 
  60.             sendMessage() 
  61.         }); 
  62.   
  63.         $('#leave-room').click(function(){ 
  64.             leaveRoom(); 
  65.         }); 
  66.     }); 
  67. </script> 
  68. </head> 
  69.   
  70. <body> 
  71.   
  72.     <div class="container chat-signin"> 
  73.         <form class="form-signin"> 
  74.             <h2 class="form-signin-heading">Chat sign in</h2> 
  75.             <label for="nickname">Nickname</label> <input type="text" 
  76.                 class="input-block-level" placeholder="Nickname" id="nickname"> 
  77.             <div class="btn-group"> 
  78.                 <label for="chatroom">Chatroom</label> <select size="1" 
  79.                     id="chatroom"> 
  80.                     <option>arduino</option> 
  81.                     <option>java</option> 
  82.                     <option>groovy</option> 
  83.                     <option>scala</option> 
  84.                 </select> 
  85.             </div> 
  86.             <button class="btn btn-large btn-primary" type="submit" 
  87.                 id="enterRoom">Sign in</button> 
  88.         </form> 
  89.     </div> 
  90.     <!-- /container --> 
  91.   
  92.     <div class="container chat-wrapper"> 
  93.         <form id="do-chat"> 
  94.             <h2 class="alert alert-success"></h2> 
  95.             <table id="response" class="table table-bordered"></table> 
  96.             <fieldset> 
  97.                 <legend>Enter your message..</legend> 
  98.                 <div class="controls"> 
  99.                     <input type="text" class="input-block-level" placeholder="Your message..." id="message" style="height:60px"/> 
  100.                     <input type="submit" class="btn btn-large btn-block btn-primary" 
  101.                         value="Send message" /> 
  102.                     <button class="btn btn-large btn-block" type="button" id="leave-room">Leave 
  103.                         room</button> 
  104.                 </div> 
  105.             </fieldset> 
  106.         </form> 
  107.     </div> 
  108. </body> 
  109. </html> 

在上面的代碼中,要注意如下幾點:

在Javascript端要調用websocket的話,要用如下的方式發起連接即可:ws://IP:PORT/CONTEXT_PATH/ENDPOINT_URL e.g ws://0.0.0.0:8080/hascode/chat/java

創建一個Websocket連接的方法很簡單,使用的是var wsocket = new WebSocket(‘ws://0.0.0.0:8080/hascode/chat/java’);

要獲得來自服務端返回的信息,只需要在回調函數wsocket.onmessage中設置對應的獲取返回信息的方法即可。

發送一個Websocket消息到服務端,使用的方法是wsocket.send(),其中可以發送的消息可以文本或者二進制數據。

關閉連接使用的是wsocket.close()。

Websocket中還有其他很多種用法,具體的可以參考其標準規范文檔(http://tools.ietf.org/html/rfc6455)

最后,我們通過

mvn package embedded-glassfish:run

進行代碼的部署,然后就可以看到本文開始部分截圖的效果。

本文的代碼可以通過git獲得:

git clone https://bitbucket.org/hascode/javaee7-websocket-chat.git

讀者也可以通過這個地址下載可部署的war包:

原文鏈接:http://www.hascode.com/2013/08/creating-a-chat-application-using-java-ee-7-websockets-and-glassfish-4/

責任編輯:陳四芳 來源: 51CTO
相關推薦

2013-12-03 17:46:35

開發技術周刊

2013-06-21 15:07:22

2013-03-08 11:06:03

JavaEEGlassFish

2022-11-14 08:01:48

2011-12-15 11:11:51

JavaNIO

2023-02-10 08:16:48

WebSocket簡易聊天室

2022-07-26 14:53:10

WebSocket網絡通信協議

2013-05-24 10:37:54

JavaEE7發布JavaEE

2012-05-21 09:31:56

HTML5

2012-05-15 15:03:17

HP ProLiant

2011-11-21 14:21:56

HTML 5

2011-02-23 16:30:41

華碩服務器

2015-07-06 10:42:18

PHP聊天室應用

2021-11-16 09:38:10

鴻蒙HarmonyOS應用

2009-11-19 08:54:20

Windows 7系統生態鏈

2013-01-05 09:58:35

JavaEEJavaEE7JMS 2.0

2011-10-11 11:43:04

筆記本評測

2023-01-05 09:17:58

2023-01-13 00:02:41

2021-02-06 23:26:25

聊天室開發WebSocket
點贊
收藏

51CTO技術棧公眾號

国产高清无密码一区二区三区| 91久久国产| 色综合天天综合网天天狠天天| 女女同性女同一区二区三区91| 日韩精品一区二区亚洲av观看| 精品日韩一区| 欧美一区2区视频在线观看| av动漫在线播放| 四虎在线免费看| 奇米精品一区二区三区在线观看| 久热精品视频在线观看一区| 免费成人深夜夜行p站| 51一区二区三区| 一区二区欧美精品| 免费国产在线精品一区二区三区| 一炮成瘾1v1高h| 亚洲激情自拍| 丝袜亚洲欧美日韩综合| 国产午夜在线一区二区三区| 日韩精品三区| 亚洲成国产人片在线观看| 日韩欧美亚洲精品| 日本xxxxxwwwww| 久久电影网电视剧免费观看| 欧美一级bbbbb性bbbb喷潮片| 四虎影视1304t| 日韩美女毛片| 欧美电影免费观看完整版| 成人中文字幕av| av在线小说| 最新欧美精品一区二区三区| 你懂的视频在线一区二区| 精品人妻无码一区二区| 美日韩一区二区三区| 69久久夜色精品国产69| 青青草原在线免费观看| 日韩毛片视频| 亚洲欧美激情四射在线日| 性高潮免费视频| crdy在线观看欧美| 欧洲生活片亚洲生活在线观看| 免费毛片网站在线观看| 日本无删减在线| 1024精品合集| 亚洲高清资源综合久久精品| 欧美日韩在线精品一区二区三区激情综| 国产aⅴ综合色| 91九色蝌蚪国产| 中文字幕人妻色偷偷久久| 老司机精品视频网站| 97久久精品视频| 黄色小视频在线免费看| 欧美成熟视频| 欧美成人精品不卡视频在线观看| 激情五月激情综合| 国产精品探花在线观看| 亚洲欧美日韩精品久久奇米色影视| 熟妇高潮一区二区| 波多野结衣在线一区二区| 日韩欧美国产综合在线一区二区三区| 伊人五月天婷婷| 欧美一级片网址| 91麻豆精品国产91久久久久久久久 | 亚洲日本韩国一区| 制服国产精品| 国产精品刘玥久久一区| 亚洲精品高清在线| 国产av熟女一区二区三区| 国产又色又爽又黄刺激在线视频| 亚洲综合在线免费观看| 国产精品999视频| 在线天堂中文资源最新版| 欧美日韩亚洲视频| 免费观看成人网| 日韩欧美激情| 日韩免费观看高清完整版| 色哟哟无码精品一区二区三区| 第四色中文综合网| 精品一区二区三区四区| 97人妻人人揉人人躁人人| 色婷婷色综合| 久久成人精品视频| 中文字幕在线观看免费视频| 久久精品中文| 91精品久久久久久| 肥臀熟女一区二区三区| 91麻豆视频网站| 亚洲高清视频在线观看| 怡红院在线观看| 欧美日韩美女在线| 潘金莲激情呻吟欲求不满视频| 欧美在线在线| 亚洲天堂日韩电影| a级片在线观看免费| 99热这里只有精品8| 国产精品久久久久久亚洲影视| 国产视频aaa| 26uuu久久天堂性欧美| 亚洲一区二区三区免费看| 日本理论片午伦夜理片在线观看| 色8久久人人97超碰香蕉987| 五月六月丁香婷婷| 丝袜连裤袜欧美激情日韩| 日韩在线观看免费全| 国产精品1234区| 奇米影视一区二区三区| 黄色91av| 超碰超碰在线| 在线免费av一区| 日本人添下边视频免费| 日韩欧美中文| 欧美一级在线亚洲天堂| 国产乱人乱偷精品视频| 久久久久国产精品麻豆| 成人毛片100部免费看| 国产 日韩 欧美一区| 亚洲国产精品yw在线观看 | 日本黄色不卡视频| 国产精品国产自产拍高清av| 日本免费黄视频| 亚洲不卡在线| 久久久久www| 69xxxx国产| 99久久久精品| 免费观看亚洲视频| 亚洲综合资源| 在线视频欧美日韩精品| 性无码专区无码| 国产·精品毛片| 艳母动漫在线观看| 国产精品久久久久久久久免费高清| 亚洲精品乱码久久久久久按摩观| 午夜爱爱毛片xxxx视频免费看| 日韩精品一卡二卡三卡四卡无卡 | 欧美日韩播放| 91精品国产高清自在线 | 国产高清成人在线| 日韩国产精品毛片| 少妇高潮一区二区三区99| 亚洲欧美综合另类中字| 免费黄色网址在线| 99久久777色| 国产美女主播在线播放| 在线精品国产亚洲| 欧美疯狂xxxx大交乱88av| 国产伦精品一区二区三区四区 | 日本欧美精品久久久| 国内精彩免费自拍视频在线观看网址| 精品国产伦一区二区三区观看方式| 国产黄色小视频网站| 激情综合色综合久久| 在线电影看在线一区二区三区| 123成人网| 深夜福利日韩在线看| 91麻豆精品在线| 国产日韩欧美综合在线| 欧美精品性生活| 日韩国产综合| 国产狼人综合免费视频| 日本中文字幕视频在线| 欧美日韩大陆在线| www欧美com| 国产一区二区三区在线观看免费视频| 桥本有菜av在线| 不卡精品视频| 欧美国产视频一区二区| 免费国产精品视频| 精品成人av一区| www.中文字幕av| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲自拍偷拍二区| 日本精品视频| 午夜精品福利视频| 男女污污视频在线观看| 欧美亚洲综合色| 日韩激情综合网| 成人听书哪个软件好| 波多野结衣家庭教师在线播放| 你懂的视频欧美| 国产日韩精品在线观看| 性xxxfreexxxx性欧美| 亚洲国内高清视频| 国模私拍一区二区| 一区二区三区精品在线观看| 一起草在线视频| 男女男精品网站| www.国产在线视频| 中国av一区| 91免费高清视频| 久草在线资源站手机版| 中文字幕少妇一区二区三区| 不卡的日韩av| 欧美在线免费播放| 欧美成人三级在线观看| 久久久久久久久99精品| 曰本三级日本三级日本三级| 国产麻豆综合| 激情五月五月婷婷| 久久99久久人婷婷精品综合| 亚洲影视九九影院在线观看| 天堂av中文在线观看| 久久伊人免费视频| 精品久久av| 欧美xfplay| 在线观看免费观看在线| 欧美日韩视频免费播放| 久久高清内射无套| 国产调教视频一区| 欧美日韩人妻精品一区在线| 美女视频免费一区| 日本久久久精品视频| 欧美成人高清| 永久久久久久| 精品一区不卡| 美媛馆国产精品一区二区| 一区二区三区自拍视频| 国产久一一精品| 日韩国产激情| 午夜免费日韩视频| 在线观看男女av免费网址| 中文日韩电影网站| 日本福利片在线| 精品美女一区二区三区| 91免费视频播放| 欧美性生活大片视频| 99久久精品国产亚洲| 亚洲国产精品久久久久秋霞影院| 视频国产一区二区| 欧美经典一区二区三区| 国产呦小j女精品视频| 成人激情黄色小说| 色婷婷一区二区三区在线观看| 免费视频一区二区| 亚洲黄色a v| 六月丁香综合| 欧美二区在线视频| 国产欧美三级| 欧美视频在线免费播放| 国内视频精品| 精品国偷自产一区二区三区| 女人色偷偷aa久久天堂| 天天干天天色天天爽| 日韩极品一区| 青青草原国产免费| 国产精品久久久久久麻豆一区软件| 性欧美精品一区二区三区在线播放| 免费观看久久av| 欧美日韩一区二区三区在线观看免 | 日韩成人免费在线| 免费大片在线观看| 日韩高清不卡一区二区三区| 99视频在线免费| 免费人成精品欧美精品| 中文字幕久久av| 国内欧美视频一区二区| 欧美一级免费在线| 国产精品一区二区无线| 不许穿内裤随时挨c调教h苏绵| 国产精品一区二区在线观看网站| 少妇丰满尤物大尺度写真| 国产高清亚洲一区| aaaa黄色片| 久久综合色婷婷| www亚洲色图| 亚洲婷婷综合色高清在线| 毛片a片免费观看| 午夜久久久久久| 成人公开免费视频| 欧美日韩国产一二三| 国产视频www| 亚洲国产精品一区二区三区 | 日韩有码视频在线| 综合久久2019| 97超级碰在线看视频免费在线看| 综合另类专区| 国产日产久久高清欧美一区| 日韩最新av| 久久久久久亚洲精品不卡4k岛国 | 国产99久久久久久免费看农村| 波多野结衣加勒比| 国产亚洲成年网址在线观看| 国产福利视频网站| 黄色一区二区三区| www.五月婷婷.com| 欧美一二三区在线| 视频一区二区在线播放| 色视频www在线播放国产成人| 在线黄色网页| 国产ts一区二区| 国产视频一区二区在线播放| 精品婷婷色一区二区三区蜜桃| 精品国产91久久久久久浪潮蜜月| 国产日产欧美一区二区| 国产精品日本欧美一区二区三区| 一本岛在线视频| av在线这里只有精品| 特黄一区二区三区| 午夜免费久久看| 国产美女www爽爽爽视频| 日韩高清人体午夜| gogogogo高清视频在线| 日本精品久久久久影院| 国产欧美日韩电影| 麻豆蜜桃91| 欧美三级乱码| 欧美三级午夜理伦三级富婆| eeuss国产一区二区三区| 国产成人在线网址| 精品女同一区二区三区在线播放| 一级淫片免费看| 亚洲一区二区久久久| 日本h片在线| 成人激情在线观看| 久久av影视| 国产男女免费视频| 国产麻豆视频一区| 国产白丝一区二区三区| 色婷婷国产精品久久包臀| 亚洲奶汁xxxx哺乳期| 色噜噜狠狠色综合网图区| 巨茎人妖videos另类| 国产精品高清一区二区三区| 99久久九九| 久久99999| 久久精品一区四区| 国产成人无码一区二区三区在线| 精品日韩欧美一区二区| 免费黄色电影在线观看| 国产精品久久久久久av下载红粉 | 亚洲美女喷白浆| a级片免费在线观看| 99久久精品久久久久久ai换脸| 日韩精品首页| 亚洲精品怡红院| 国产三级久久久| 亚洲不卡在线视频| 亚洲精品在线视频| 天堂av在线网| 欧美黑人xxxxx| 久久99伊人| 亚洲一区二区三区蜜桃| 一本色道久久综合亚洲精品按摩| 无码国产精品一区二区免费16| 欧美片一区二区三区| 国产一区二区| 特级西西444| 国产精品亚洲一区二区三区妖精| 永久免费看片直接| 欧美精品黑人性xxxx| 成人在线视频亚洲| 91九色偷拍| 国产在线不卡| 国模私拍在线观看| 亚洲成人av免费| 三级在线视频| 国产成人精品优优av| 精品午夜久久| av在线网址导航| 中文字幕综合网| 草逼视频免费看| 97视频在线看| 免费成人结看片| 国产高潮免费视频| 中文字幕永久在线不卡| 国产日韩精品suv| 欧美疯狂xxxx大交乱88av| 成人涩涩网站| 欧美a在线视频| 国产清纯美女被跳蛋高潮一区二区久久w | 亚洲free性xxxx护士白浆| 国产精品magnet| 中文字幕 亚洲一区| 在线一区二区三区四区五区 | 777777777亚洲妇女| 偷拍自拍亚洲色图| 奇米影音第四色| 亚洲精品成人精品456| 污污网站在线免费观看| 国产成人免费av电影| 亚洲精品国产成人影院| 丰满岳乱妇一区二区| 色婷婷国产精品综合在线观看| 视频免费一区| 精品一区久久久| 全国精品久久少妇| 久久精品人妻一区二区三区| 精品亚洲夜色av98在线观看 | 欧美一级艳片视频免费观看| cao在线视频| 亚洲精品日韩精品| 国产 欧美在线| 波多野结衣影片| 欧美乱妇高清无乱码| 国产一区二区三区四区大秀| 污免费在线观看| 色综合天天综合色综合av| 污污影院在线观看| 日本一区网站| 成人sese在线| 国产美女精品视频国产|