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

Spring整合DWR comet 實現(xiàn)無刷新 多人聊天室

開發(fā) 后端
用dwr的comet(推)來實現(xiàn)簡單的無刷新多人聊天室,comet是長連接的一種。通常我們要實現(xiàn)無刷新,一般會使用到Ajax。

用dwr的comet(推)來實現(xiàn)簡單的無刷新多人聊天室,comet是長連接的一種。通常我們要實現(xiàn)無刷新,一般會使用到Ajax。Ajax 應(yīng)用程序可以使用兩種基本的方法解決這一問題:一種方法是瀏覽器每隔若干秒時間向服務(wù)器發(fā)出輪詢以進行更新,另一種方法是服務(wù)器始終打開與瀏覽器的連接并在數(shù)據(jù)可用時發(fā)送給瀏覽器。***種方法一般利用setTimeout或是setInterval定時請求,并返回***數(shù)據(jù),這無疑增加了服務(wù)器的負擔(dān),浪費了大量的資源。而第二種方法也會浪費服務(wù)器資源,長期的建立連接;而相對***種來說,第二種方式會更優(yōu)于***種方法;這里有一個一對多和多對一的關(guān)系,而comet向多個客戶端推送數(shù)據(jù)就是一對多的關(guān)系。而具體使用哪種方式,要看你當(dāng)前的需求而定,沒有絕對的。

為什么使用Comet?

輪詢方法的主要缺點是:當(dāng)擴展到更多客戶機時,將生成大量的通信量。每個客戶機必須定期訪問服務(wù)器以檢查更新,這為服務(wù)器資源添加了更多負荷。最壞的一種情況是對不頻繁發(fā)生更新的應(yīng)用程序使用輪詢,例如一種 Ajax 郵件 Inbox。在這種情況下,相當(dāng)數(shù)量的客戶機輪詢是沒有必要的,服務(wù)器對這些輪詢的回答只會是 “沒有產(chǎn)生新數(shù)據(jù)”。雖然可以通過增加輪詢的時間間隔來減輕服務(wù)器負荷,但是這種方法會產(chǎn)生不良后果,即延遲客戶機對服務(wù)器事件的感知。當(dāng)然,很多應(yīng)用程序可以實現(xiàn)某種權(quán)衡,從而獲得可接受的輪詢方法。

盡管如此,吸引人們使用 Comet 策略的其中一個優(yōu)點是其顯而易見的高效性。客戶機不會像使用輪詢方法那樣生成煩人的通信量,并且事件發(fā)生后可立即發(fā)布給客戶機。但是保持長期連接處于打開狀態(tài)也會消耗服務(wù)器資源。當(dāng)?shù)却隣顟B(tài)的 servlet 持有一個持久性請求時,該 servlet 會獨占一個線程。這將限制 Comet 對傳統(tǒng) servlet 引擎的可伸縮性,因為客戶機的數(shù)量會很快超過服務(wù)器棧能有效處理的線程數(shù)量。

如果本示例結(jié)合Jetty應(yīng)用服務(wù)器效果會更好。

開發(fā)環(huán)境:

System:Windows

WebBrowser:IE6+、Firefox3+

JavaEE Server:tomcat5.0.2.8、tomcat6

IDE:eclipse、MyEclipse 8

開發(fā)依賴庫:

JavaEE5、Spring 3.0.5、dwr 3

Email:hoojo_@126.com

Blog:http://blog.csdn.net/IBM_hoojo or http://hoojo.cnblogs.com/

#p#

一、準(zhǔn)備工作

1、 下載dwr的相關(guān)jar包

https://java.net/downloads/dwr/Development%20Builds/Build%20116/dwr.jar

程序中還需要spring的相關(guān)jar包

http://ebr.springsource.com/repository/app/library/version/detail?name=org.springframework.spring&version=3.0.5.RELEASE

需要的jar包如下

 

2、 建立一個WebProject,名稱DWRComet

在web.xml中添加dwr、spring配置如下:

  1. <-- 加載Spring容器配置 --> 
  2. <listener> 
  3.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
  4. </listener> 
  5.    
  6. <-- 設(shè)置Spring容器加載配置文件路徑 --> 
  7. <context-param> 
  8.     <param-name>contextConfigLocation</param-name> 
  9.     <param-value>classpath*:applicationContext-*.xml</param-value> 
  10. </context-param> 
  11.    
  12. <listener> 
  13.     <listener-class>org.directwebremoting.servlet.DwrListener</listener-class> 
  14. </listener> 
  15.    
  16. <servlet> 
  17.     <servlet-name>dwr-invoker</servlet-name> 
  18.     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 
  19.     <init-param> 
  20.         <param-name>debug</param-name> 
  21.         <param-value>true</param-value> 
  22.     </init-param> 
  23.           
  24.     <-- dwr的comet控制 --> 
  25.     <init-param> 
  26.       <param-name>pollAndCometEnabled</param-name> 
  27.       <param-value>true</param-value> 
  28.     </init-param> 
  29. </servlet> 
  30.    
  31. <servlet-mapping> 
  32.     <servlet-name>dwr-invoker</servlet-name> 
  33.     <url-pattern>/dwr/*</url-pattern> 
  34. </servlet-mapping> 

3、 在src目錄加入applicationContext-beans.xml配置,這個配置專門配置bean對象,用來配置需要注入的對象。

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:aop="http://www.springframework.org/schema/aop" 
  5.     xmlns:tx="http://www.springframework.org/schema/tx"   
  6.     xmlns:util="http://www.springframework.org/schema/util" 
  7.     xmlns:context="http://www.springframework.org/schema/context" 
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  9.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  10.     http://www.springframework.org/schema/aop   
  11.     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  12.     http://www.springframework.org/schema/tx   
  13.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  14.     http://www.springframework.org/schema/util   
  15.     http://www.springframework.org/schema/util/spring-util-3.0.xsd  
  16.     http://www.springframework.org/schema/context   
  17.     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
  18. </beans> 

4、 在WEB-INF目錄添加dwr.xml文件,基本代碼如下

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"> 
  3. <dwr> 
  4. </dwr> 

以上的準(zhǔn)備基本完畢,下面來完成無刷新聊天室代碼

#p#

二、聊天室相關(guān)業(yè)務(wù)實現(xiàn)

1、 聊天實體類Model

  1. package com.hoo.entity;  
  2.    
  3. import java.util.Date;  
  4.    
  5. /**  
  6.  * <b>function:</b>  
  7.  * @author hoojo  
  8.  * @createDate 2011-6-3 下午06:40:07  
  9.  * @file Message.java  
  10.  * @package com.hoo.entity  
  11.  * @project DWRComet  
  12.  * @blog http://blog.csdn.net/IBM_hoojo  
  13.  * @email hoojo_@126.com  
  14.  * @version 1.0  
  15.  */ 
  16. public class Message {  
  17.     private int id;  
  18.     private String msg;  
  19.     private Date time;  
  20.     //getter、setter  

2、 編寫聊天信息的事件

  1. package com.hoo.chat;  
  2.    
  3. import org.springframework.context.ApplicationEvent;  
  4.    
  5. /**  
  6.  * <b>function:</b>發(fā)送聊天信息事件  
  7.  * @author hoojo  
  8.  * @createDate 2011-6-7 上午11:24:21  
  9.  * @file MessageEvent.java  
  10.  * @package com.hoo.util  
  11.  * @project DWRComet  
  12.  * @blog http://blog.csdn.net/IBM_hoojo  
  13.  * @email hoojo_@126.com  
  14.  * @version 1.0  
  15.  */ 
  16. public class ChatMessageEvent extends ApplicationEvent {  
  17.    
  18.     private static final long serialVersionUID = 1L;  
  19.    
  20.     public ChatMessageEvent(Object source) {  
  21.         super(source);  
  22.     }  

繼承ApplicationEvent,構(gòu)造參數(shù)用于傳遞發(fā)送過來的消息。這個事件需要一個監(jiān)聽器監(jiān)聽,一旦觸發(fā)了這個事件,我們就可以向客戶端發(fā)送消息。

3、 發(fā)送消息服務(wù)類,用戶客戶端發(fā)送消息。dwr需要暴露這個類里面的發(fā)送消息的方法

  1. package com.hoo.chat;  
  2.    
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.ApplicationContextAware;  
  6. import com.hoo.entity.Message;  
  7.    
  8. /**  
  9.  * <b>function:</b>客戶端發(fā)消息服務(wù)類業(yè)務(wù)  
  10.  * @author hoojo  
  11.  * @createDate 2011-6-7 下午02:12:47  
  12.  * @file ChatService.java  
  13.  * @package com.hoo.chat  
  14.  * @project DWRComet  
  15.  * @blog http://blog.csdn.net/IBM_hoojo  
  16.  * @email hoojo_@126.com  
  17.  * @version 1.0  
  18.  */ 
  19. public class ChatService implements ApplicationContextAware {  
  20.     private ApplicationContext ctx;  
  21.     public void setApplicationContext(ApplicationContext ctx) throws BeansException {  
  22.         this.ctx = ctx;  
  23.     }  
  24.       
  25.     /**  
  26.      * <b>function:</b> 向服務(wù)器發(fā)送信息,服務(wù)器端監(jiān)聽ChatMessageEvent事件,當(dāng)有事件觸發(fā)就向所有客戶端發(fā)送信息  
  27.      * @author hoojo  
  28.      * @createDate 2011-6-8 下午12:37:24  
  29.      * @param msg  
  30.      */ 
  31.     public void sendMessage(Message msg) {  
  32.         //發(fā)布事件  
  33.         ctx.publishEvent(new ChatMessageEvent(msg));  
  34.     }  

上面的sendMessage需要瀏覽器客戶端調(diào)用此方法完成消息的發(fā)布,傳遞一個Message對象,并且是觸發(fā)ChatMessageEvent事件。

#p#

4、 編寫監(jiān)聽器監(jiān)聽客戶端是否觸發(fā)ChatMessageEvent

  1. package com.hoo.chat;  
  2.    
  3. import java.util.Collection;  
  4. import java.util.Date;  
  5. import javax.servlet.ServletContext;  
  6. import org.directwebremoting.ScriptBuffer;  
  7. import org.directwebremoting.ScriptSession;  
  8. import org.directwebremoting.ServerContext;  
  9. import org.directwebremoting.ServerContextFactory;  
  10. import org.springframework.context.ApplicationEvent;  
  11. import org.springframework.context.ApplicationListener;  
  12. import org.springframework.web.context.ServletContextAware;  
  13. import com.hoo.entity.Message;  
  14.    
  15. /**  
  16.  * <b>function:</b>監(jiān)聽客戶端事件,想客戶端推出消息  
  17.  * @author hoojo  
  18.  * @createDate 2011-6-7 上午11:33:08  
  19.  * @file SendMessageClient.java  
  20.  * @package com.hoo.util  
  21.  * @project DWRComet  
  22.  * @blog http://blog.csdn.net/IBM_hoojo  
  23.  * @email hoojo_@126.com  
  24.  * @version 1.0  
  25.  */ 
  26. @SuppressWarnings("unchecked")  
  27. public class ChatMessageClient implements ApplicationListener, ServletContextAware {  
  28.       
  29.     private ServletContext ctx;  
  30.     public void setServletContext(ServletContext ctx) {  
  31.         this.ctx = ctx;  
  32.     }  
  33.       
  34.     @SuppressWarnings("deprecation")  
  35.     public void onApplicationEvent(ApplicationEvent event) {  
  36.         //如果事件類型是ChatMessageEvent就執(zhí)行下面操作  
  37.         if (event instanceof ChatMessageEvent) {  
  38.             Message msg = (Message) event.getSource();  
  39.             ServerContext context = ServerContextFactory.get();  
  40.             //獲得客戶端所有chat頁面script session連接數(shù)  
  41.    
  42.             Collection<ScriptSession> sessions = context.getScriptSessionsByPage(ctx.getContextPath() + "/chat.jsp");  
  43.             for (ScriptSession session : sessions) {  
  44.                 ScriptBuffer sb = new ScriptBuffer();  
  45.                 Date time = msg.getTime();  
  46.                 String s = time.getYear() + "-" + (time.getMonth() + 1) + "-" +  time.getDate() + " "   
  47.                         +  time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();  
  48.                 //執(zhí)行setMessage方法  
  49.    
  50.                 sb.appendScript("showMessage({msg: '")  
  51.                 .appendScript(msg.getMsg())  
  52.                 .appendScript("', time: '")  
  53.                 .appendScript(s)  
  54.                 .appendScript("'})");  
  55.                 System.out.println(sb.toString());  
  56.                 //執(zhí)行客戶端script session方法,相當(dāng)于瀏覽器執(zhí)行JavaScript代碼  
  57.                   //上面就會執(zhí)行客戶端瀏覽器中的showMessage方法,并且傳遞一個對象過去  
  58.    
  59.                 session.addScript(sb);  
  60.             }  
  61.         }  
  62.     }  

上面的代碼主要是監(jiān)聽客戶端的事件,一旦客戶端有觸發(fā)ApplicationEvent事件或是其子類,就會執(zhí)行onApplicationEvent方法。代碼中通過instanceof判斷對象實例,然后再執(zhí)行。如果有觸發(fā)ChatMessageEvent事件,就獲取所有連接chat.jsp這個頁面的ScriptSession。然后像所有的ScriptSession中添加script。這樣被添加的ScriptSession就會在有連接chat.jsp的頁面中執(zhí)行。

所以這就是客戶端為什么會執(zhí)行服務(wù)器端的JavaScript代碼。但前提是需要在web.xml中添加dwrComet配置以及在chat頁面添加ajax反轉(zhuǎn)。

5、 下面開始在bean容器和dwr的配置中添加我們的配置

applicationContext-beans.xml配置

  1. <bean id="chatService" class="com.hoo.chat.ChatService"/> 
  2. <bean id="chatMessageClient" class="com.hoo.chat.ChatMessageClient"/> 

上面的chatService會在dwr配置中用到

dwr.xml配置

  1. <allow> 
  2.     <convert match="com.hoo.entity.Message" converter="bean"> 
  3.         <param name="include" value="msg,time" /> 
  4.     </convert> 
  5.    
  6.     <create creator="spring" javascript="ChatService"> 
  7.         <param name="beanName" value="chatService" /> 
  8.     </create> 
  9. </allow> 

charService的sendMessage方法傳遞的是Message對象,所以要配置Message對象的convert配置。

上面的create的creator是spring,表示在spring容器中拿chatService對象。里面的參數(shù)的beanName表示在spring容器中找name等于charService的bean對象。

#p#

6、 客戶端chat.jsp頁面代碼

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %> 
  6.    
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  8. <html> 
  9.   <head> 
  10.     <base href="<%=basePath%>"> 
  11.       
  12.     <title>Chat</title> 
  13.       
  14.     <meta http-equiv="pragma" content="no-cache"> 
  15.     <meta http-equiv="cache-control" content="no-cache"> 
  16.     <meta http-equiv="expires" content="0">      
  17.     <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/engine.js"></script> 
  18.     <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/util.js"></script> 
  19.     <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/interface/ChatService.js"></script> 
  20.     <script type="text/javascript"> 
  21.         function send() {  
  22.             var time = new Date();  
  23.             var content = dwr.util.getValue("content");  
  24.             var name = dwr.util.getValue("userName");  
  25.             var info = encodeURI(encodeURI(name + " say:\n" + content));  
  26.             var msg = {"msg": info, "time": time};  
  27.             dwr.util.setValue("content", "");  
  28.             if (!!content) {  
  29.                 ChatService.sendMessage(msg);  
  30.             } else {  
  31.                 alert("發(fā)送的內(nèi)容不能為空!");  
  32.             }  
  33.         }  
  34.    
  35.         function showMessage(data) {  
  36.             var message = decodeURI(decodeURI(data.msg));  
  37.             var text = dwr.util.getValue("info");  
  38.             if (!!text) {    
  39.                 dwr.util.setValue("info", text + "\n" + data.time + "  " + message);  
  40.             } else {  
  41.                 dwr.util.setValue("info", data.time + "  " + message);  
  42.             }  
  43.         }  
  44.     </script> 
  45.   </head> 
  46.     
  47.   <body onload="dwr.engine.setActiveReverseAjax(true);"> 
  48.       <textarea rows="20" cols="60" id="info" readonly="readonly"></textarea> 
  49.       <hr/> 
  50.       昵稱:<input type="text" id="userName"/><br/> 
  51.       消息:<textarea rows="5" cols="30" id="content"></textarea> 
  52.       <input type="button" value=" Send " onclick="send()" style="height: 85px; width: 85px;"/> 
  53.   </body> 
  54. </html> 

首先,你需要導(dǎo)入dwr的engine.js文件,這個很重要,是dwr的引擎文件。其次你使用的那個類的方法,也需要在導(dǎo)入進來。一般是interface下的,并且在dwr.xml中配置過的create。

上面的js中調(diào)用的charService類中的sendMessage方法,所以在jsp頁面中導(dǎo)入的是ChatService.js。

在body的onload事件中,需要設(shè)置反轉(zhuǎn)Ajax,這個很重要。

showMessage是ChatMessageClient的onApplicationEvent方法中的appendScript中需要執(zhí)行的方法。data參數(shù)也是在那里傳遞過來的。

每當(dāng)發(fā)送sendMessage方法后就會觸發(fā)ChatMessageEvent事件,然后監(jiān)聽的地方就會執(zhí)行onApplicationEvent方法,在這個方法中又會執(zhí)行瀏覽器中的showMessage方法。

 

原文鏈接:http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html

【編輯推薦】

  1. Oracle計劃修復(fù)Java SE中的17個漏洞
  2. Java SE 6新年***次更新 修復(fù)Bug超300個
  3. JDK 5和Java SE 6小更新
  4. Java SE 6更新 修復(fù)重大安全問題
  5. Java SE 6中的垃圾回收器G1收費是虛驚一場

 

 

責(zé)任編輯:艾婧 來源: hoojo的博客
相關(guān)推薦

2023-01-13 00:02:41

2023-01-05 09:17:58

2011-12-15 11:11:51

JavaNIO

2023-02-10 08:16:48

WebSocket簡易聊天室

2015-07-06 10:42:18

PHP聊天室應(yīng)用

2022-07-26 14:53:10

WebSocket網(wǎng)絡(luò)通信協(xié)議

2025-05-09 08:35:00

聊天室FastAPIWebSocket

2021-11-16 09:38:10

鴻蒙HarmonyOS應(yīng)用

2025-06-09 02:00:00

項目技術(shù)棧Spring

2022-11-14 08:01:48

2022-12-01 08:25:23

eTsTCP聊天室

2011-11-30 16:37:58

sync

2021-10-14 18:46:29

Websocket瀏覽器API

2015-08-06 17:17:33

swoole聊天室

2024-10-07 10:45:12

2022-04-18 10:36:48

社交軟件聊天平臺rocket.cha

2021-11-15 11:32:12

Linux Linux sockeLinux 系統(tǒng)

2021-12-09 16:48:25

鴻蒙HarmonyOS應(yīng)用

2024-01-18 11:15:46

Pythonsocket聊天室
點贊
收藏

51CTO技術(shù)棧公眾號

欧美视频在线视频| 五月开心六月丁香综合色啪| 日韩欧美aⅴ综合网站发布| 日韩欧美视频第二区| 黄色网址中文字幕| 图片小说视频色综合| 亚洲第一福利网| 国产精品一区二区小说| 岛国毛片av在线| 久久久久久久久久久黄色| 国产免费一区二区三区香蕉精| 印度午夜性春猛xxx交| 欧美午夜寂寞| 制服丝袜激情欧洲亚洲| 日日碰狠狠添天天爽超碰97| 男人天堂手机在线| 久久亚洲影视婷婷| 91中文在线观看| 97人妻一区二区精品视频| 欧美一区二区三区另类| 亚洲女成人图区| 欧洲美女亚洲激情| 不卡av播放| 亚洲最快最全在线视频| 五月天久久综合网| 无码精品视频一区二区三区 | 国产精品色噜噜| 精品久久久久久中文字幕动漫| 亚洲综合精品国产一区二区三区| 中文精品在线| 欧美成人午夜激情在线| 亚洲日本精品视频| 日韩高清一级| 精品国精品国产| 91网址在线观看精品| 日本肉肉一区 | 欧美成人合集magnet| 亚洲av成人无码久久精品| 欧美调教网站| 亚洲国产精品高清久久久| 亚洲天堂一区二区在线观看| 黄色欧美视频| 欧美日韩在线精品一区二区三区激情| 国产福利视频在线播放| 国产v日韩v欧美v| 亚洲高清免费视频| 一卡二卡三卡视频| 国产又色又爽又黄刺激在线视频| 亚洲女子a中天字幕| 一区二区三区四区不卡| 午夜激情视频在线观看| 国产精品无圣光一区二区| 日本一区二区三区视频在线播放| 欧美日韩伦理片| 久久精品视频一区| 日韩电影免费观看在| 国产免费av在线| 亚洲国产精品黑人久久久 | 婷婷综合五月| 久久国产精品久久久久| 极品久久久久久| 欧美国产先锋| 欧美精品激情视频| 国产成人在线免费观看视频| 国产精品婷婷| 国产成人精品久久久| 亚洲精品国产精品国自产网站按摩| 日本一区中文字幕| 国产日韩欧美黄色| 国产xxxx孕妇| 不卡的av电影在线观看| 久久综合伊人77777麻豆| 男人天堂网在线| 国产精品欧美极品| 日韩精品福利片午夜免费观看| 欧洲中文在线| 一本色道**综合亚洲精品蜜桃冫| 9久久婷婷国产综合精品性色| 色诱色偷偷久久综合| 日韩视频永久免费| 免费a v网站| 不卡中文一二三区| 久久综合免费视频| 天天操天天摸天天干| 日韩国产一区二| 91在线高清视频| 无码精品视频一区二区三区 | 日本一区二区三区四区五区六区| 久久大胆人体| 91国在线观看| 下面一进一出好爽视频| 米奇精品关键词| 少妇高潮久久久久久潘金莲| 欧美日韩精品在线观看视频| 久久不射2019中文字幕| 国产欧美日韩中文| 熟妇高潮一区二区三区| 国产精品嫩草99a| 丰满少妇大力进入| 激情欧美一区二区三区黑长吊| 欧美成人bangbros| 久久亚洲无码视频| 亚洲一级高清| 国产欧美精品久久久| 欧美一级淫片免费视频魅影视频| 欧美韩国日本综合| 男人用嘴添女人下身免费视频| 精品176极品一区| 亚洲黄在线观看| 麻豆天美蜜桃91| 日本一不卡视频| 九色91视频| 日本性爱视频在线观看| 欧美午夜一区二区三区免费大片| 91精品啪在线观看国产| 亚洲欧美综合久久久| 国产成人亚洲综合91| 蜜臀av免费在线观看| 最新热久久免费视频| 国产熟人av一二三区| 国产欧美三级电影| 日韩有码在线播放| 黄色av网站免费| 91毛片在线观看| 天堂…中文在线最新版在线| 日日夜夜精品视频| www亚洲欧美| 亚洲视频一区二区三区四区| 久久新电视剧免费观看| 欧美精品久久久久久久自慰| 久久久久久亚洲精品美女| 在线视频中文亚洲| 午夜久久久久久久久久影院| 久久女同精品一区二区| av之家在线观看| 久久午夜影院| 97视频在线观看亚洲| 黄色美女一级片| 亚洲成年人影院| jjzzjjzz欧美69巨大| 欧美 亚欧 日韩视频在线| 成人欧美在线视频| 快射av在线播放一区| 56国语精品自产拍在线观看| 蜜桃av免费在线观看| 久久精品国产在热久久| 亚洲精品国产一区| 岛国精品在线| 精品久久久av| 国产女人高潮毛片| 一区二区三区在线视频免费| 伊人成人免费视频| 欧美日韩视频一区二区三区| 99视频在线播放| 麻豆av在线免费观看| 亚洲风情亚aⅴ在线发布| 精品久久免费视频| 99re成人精品视频| 丰满人妻中伦妇伦精品app| 要久久电视剧全集免费| 国产成人精品日本亚洲专区61| 国产h在线观看| 欧美剧情片在线观看| 国产大学生自拍| av一区二区三区黑人| 亚洲熟妇av一区二区三区| 国产精品密蕾丝视频下载| 国产精品久久久久久久久久东京 | 欧美国产视频一区二区| 丰满岳乱妇国产精品一区| 午夜久久电影网| 91中文字幕永久在线| 麻豆精品一区二区三区| 热这里只有精品| 国产精品男女| 国产精品69久久| 9191在线播放| 亚洲毛片在线看| 在线观看国产一区二区三区| 亚洲激情图片qvod| 一级特黄a大片免费| 日本亚洲免费观看| 欧洲精品在线播放| 精品国产一区探花在线观看| 91欧美精品成人综合在线观看| 欧美人动性xxxxz0oz| 国产婷婷成人久久av免费高清| 这里只有久久精品视频| 亚洲精品成人在线| 国产精品高清无码在线观看| 国产一区二区女| 任你操这里只有精品| 欧美激情1区2区3区| 日本一区免费在线观看| 凹凸成人在线| 成人信息集中地欧美| 亚洲欧美se| 精品自在线视频| 国产精品久久久久久久龚玥菲| 欧美mv和日韩mv的网站| 337p粉嫩色噜噜噜大肥臀| 一区二区三区日韩欧美精品| 久久久久久久久久久久久久久| 国产经典欧美精品| mm1313亚洲国产精品无码试看| 综合久久99| 亚洲va久久久噜噜噜久久狠狠| 国产精品白浆| 亚洲va电影大全| 草莓视频成人appios| 久久琪琪电影院| 成人日日夜夜| 深夜福利国产精品| 黄色片在线播放| 亚洲护士老师的毛茸茸最新章节| 国产精品久久久久久久久久久久久久久久久久 | 日韩综合小视频| a级黄色一级片| 国产一区二区三区四区老人| 一区二区不卡在线| 国产精品亚洲二区| 久久爱av电影| 福利欧美精品在线| 亚洲一区久久久| 亚洲国产伊人| 国产精品网站大全| 日韩三区免费| 日韩免费av一区二区| 咪咪网在线视频| 国内精久久久久久久久久人| a在线免费观看| 久久精品电影网站| 91伦理视频在线观看| 亚洲午夜色婷婷在线| 日本五码在线| 日韩激情视频在线播放| 天天摸天天干天天操| 日韩精品亚洲元码| 欧美理论在线观看| 国产亚洲精品激情久久| 国产女主播在线直播| 在线观看精品国产视频| av在线资源站| 色妞一区二区三区| av每日在线更新| 在线亚洲午夜片av大片| 91官网在线| 日韩中文字幕国产精品| 在线视频1区2区| 精品国产拍在线观看| 黄色动漫在线| 蜜臀久久99精品久久久久久宅男| 2024最新电影在线免费观看| 欧美大片网站在线观看| 日本不卡影院| 91av在线播放视频| 在线观看涩涩| 国产精品免费网站| 亚洲精品三区| av成人免费观看| 日韩高清成人在线| 日韩高清dvd| 国产精品麻豆久久| 成人高清dvd| 亚洲精品人人| 人妻丰满熟妇av无码区app| 蜜芽一区二区三区| 波多野结衣网页| 成人福利视频在线| 玖玖爱在线观看| 国产精品毛片大码女人| 中文字幕在线观看成人| 亚洲午夜在线观看视频在线| 国产乱国产乱老熟| 欧美日韩不卡视频| 日本人妻丰满熟妇久久久久久| 亚洲理论在线a中文字幕| 9191在线| 久久久久久国产三级电影| 日韩av中字| 亚洲一区二区三区四区视频 | 国产99一区视频免费| 国产男男chinese网站| 一区视频在线播放| 国产精品黄色网| 欧美日韩一级黄| 日本精品一二区| 日韩一区二区欧美| 乱馆动漫1~6集在线观看| 国产主播欧美精品| 欧洲亚洲视频| 黄色一级视频播放| 免费在线日韩av| 性色av浪潮av| 国产日韩精品视频一区| 国产一卡二卡在线播放| 欧美日韩一区视频| 五月婷婷丁香网| 欧美精品情趣视频| 99亚洲伊人久久精品影院| 国产一区二区三区奇米久涩| 日韩欧美中文| 成人观看免费完整观看| 国产91精品入口| 99久久精品久久亚洲精品| 福利视频一区二区| 精品国产九九九| 最近中文字幕2019免费| 欧亚av在线| 国产精华一区| 91精品久久久久久久久久不卡| 麻豆传传媒久久久爱| av电影一区二区| 免看一级a毛片一片成人不卡| 精品视频1区2区| 高清国产福利在线观看| 91精品国产自产91精品| 伊色综合久久之综合久久| 亚洲一卡二卡三卡四卡无卡网站在线看| 日韩网站在线| 国产a√精品区二区三区四区| 亚洲少妇屁股交4| 伊人色综合久久久| 国产一区二区av| 老司机2019福利精品视频导航| 国产视频在线观看一区| 你懂的国产精品永久在线| 国产无色aaa| 中文字幕亚洲视频| 影音先锋黄色网址| 国产一区二区三区三区在线观看 | 国产欧美日韩一级| 性农村xxxxx小树林| 一区二区欧美视频| 国产丰满果冻videossex| 久久九九有精品国产23| 久久亚洲国产精品尤物| 亚洲欧美国产精品桃花| 秋霞影院一区二区| 亚洲天堂精品一区| 欧美精品一二三| 免费网站免费进入在线| 国产精品视频男人的天堂| 日韩av有码| 在线免费视频一区| 国产精品视频一二三区| 91好色先生tv| 爽爽爽爽爽爽爽成人免费观看| 国产一区二区三区四区五区3d| 曰韩不卡视频| 国产美女在线精品| 免费无码毛片一区二区app| 精品国产露脸精彩对白| а√天堂8资源在线| 免费日韩av电影| 三级一区在线视频先锋| 夜夜春很很躁夜夜躁| 欧美日韩在线播放三区四区| 好吊日视频在线观看| 97人摸人人澡人人人超一碰| 国产精品大片| 国产精品无码一区二区三区| 日本道免费精品一区二区三区| 最近高清中文在线字幕在线观看| 成人精品久久久| 1024日韩| 99久久久无码国产精品衣服| 宅男噜噜噜66一区二区66| 手机在线免费观看av| 精品久久久久久中文字幕动漫 | 国产激情999| 我不卡伦不卡影院| 国产a级黄色片| 欧美在线影院一区二区| h网站久久久| 激情五月综合色婷婷一区二区 | 国产精品久久久久久免费观看| 99精品视频免费| 永久免费观看片现看| 日韩精品最新网址| 在线免费看h| 中国成人亚色综合网站| 99视频超级精品| 怡春院在线视频| 欧美日本亚洲视频| 欧美视频网址| 美女网站视频在线观看| 在线亚洲一区二区| 国内老司机av在线| 亚洲欧美日韩精品在线| 成人福利电影精品一区二区在线观看| 黄色av一级片| 国内精品久久久久久久| 色777狠狠狠综合伊人| 波多野结衣一二三区| 欧美三级电影一区| 日韩av一卡| 一本大道东京热无码aⅴ| 国产午夜亚洲精品不卡| 国产综合在线播放|