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

成都創(chuàng)新互聯(lián)公司為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、重慶App定制開發(fā)、微信平臺(tái)小程序開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。
為什么使用Comet?
輪詢方法的主要缺點(diǎn)是:當(dāng)擴(kuò)展到更多客戶機(jī)時(shí),將生成大量的通信量。每個(gè)客戶機(jī)必須定期訪問(wèn)服務(wù)器以檢查更新,這為服務(wù)器資源添加了更多負(fù)荷。最壞的一種情況是對(duì)不頻繁發(fā)生更新的應(yīng)用程序使用輪詢,例如一種 Ajax 郵件 Inbox。在這種情況下,相當(dāng)數(shù)量的客戶機(jī)輪詢是沒(méi)有必要的,服務(wù)器對(duì)這些輪詢的回答只會(huì)是 “沒(méi)有產(chǎn)生新數(shù)據(jù)”。雖然可以通過(guò)增加輪詢的時(shí)間間隔來(lái)減輕服務(wù)器負(fù)荷,但是這種方法會(huì)產(chǎn)生不良后果,即延遲客戶機(jī)對(duì)服務(wù)器事件的感知。當(dāng)然,很多應(yīng)用程序可以實(shí)現(xiàn)某種權(quán)衡,從而獲得可接受的輪詢方法。
盡管如此,吸引人們使用 Comet 策略的其中一個(gè)優(yōu)點(diǎn)是其顯而易見的高效性??蛻魴C(jī)不會(huì)像使用輪詢方法那樣生成煩人的通信量,并且事件發(fā)生后可立即發(fā)布給客戶機(jī)。但是保持長(zhǎng)期連接處于打開狀態(tài)也會(huì)消耗服務(wù)器資源。當(dāng)?shù)却隣顟B(tài)的 servlet 持有一個(gè)持久性請(qǐng)求時(shí),該 servlet 會(huì)獨(dú)占一個(gè)線程。這將限制 Comet 對(duì)傳統(tǒng) servlet 引擎的可伸縮性,因?yàn)榭蛻魴C(jī)的數(shù)量會(huì)很快超過(guò)服務(wù)器棧能有效處理的線程數(shù)量。
如果本示例結(jié)合Jetty應(yīng)用服務(wù)器效果會(huì)更好。
開發(fā)環(huán)境:
System:Windows
WebBrowser:IE6+、Firefox3+
JavaEE Server:tomcat5.0.2.8、tomcat6
IDE:eclipse、MyEclipse 8
開發(fā)依賴庫(kù):
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、 建立一個(gè)WebProject,名稱DWRComet
在web.xml中添加dwr、spring配置如下:
- <-- 加載Spring容器配置 -->
org.springframework.web.context.ContextLoaderListener - <-- 設(shè)置Spring容器加載配置文件路徑 -->
contextConfigLocation classpath*:applicationContext-*.xml org.directwebremoting.servlet.DwrListener dwr-invoker org.directwebremoting.servlet.DwrServlet debug true - <-- dwr的comet控制 -->
pollAndCometEnabled true dwr-invoker /dwr/*
3、 在src目錄加入applicationContext-beans.xml配置,這個(gè)配置專門配置bean對(duì)象,用來(lái)配置需要注入的對(duì)象。
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
4、 在WEB-INF目錄添加dwr.xml文件,基本代碼如下
以上的準(zhǔn)備基本完畢,下面來(lái)完成無(wú)刷新聊天室代碼
#p#
二、聊天室相關(guān)業(yè)務(wù)實(shí)現(xiàn)
1、 聊天實(shí)體類Model
- package com.hoo.entity;
- import java.util.Date;
- /**
- * function:
- * @author hoojo
- * @createDate 2011-6-3 下午06:40:07
- * @file Message.java
- * @package com.hoo.entity
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
- public class Message {
- private int id;
- private String msg;
- private Date time;
- //getter、setter
- }
2、 編寫聊天信息的事件
- package com.hoo.chat;
- import org.springframework.context.ApplicationEvent;
- /**
- * function:發(fā)送聊天信息事件
- * @author hoojo
- * @createDate 2011-6-7 上午11:24:21
- * @file MessageEvent.java
- * @package com.hoo.util
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
- public class ChatMessageEvent extends ApplicationEvent {
- private static final long serialVersionUID = 1L;
- public ChatMessageEvent(Object source) {
- super(source);
- }
- }
繼承ApplicationEvent,構(gòu)造參數(shù)用于傳遞發(fā)送過(guò)來(lái)的消息。這個(gè)事件需要一個(gè)監(jiān)聽器監(jiān)聽,一旦觸發(fā)了這個(gè)事件,我們就可以向客戶端發(fā)送消息。
3、 發(fā)送消息服務(wù)類,用戶客戶端發(fā)送消息。dwr需要暴露這個(gè)類里面的發(fā)送消息的方法
- package com.hoo.chat;
- import org.springframework.beans.BeansException;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ApplicationContextAware;
- import com.hoo.entity.Message;
- /**
- * function:客戶端發(fā)消息服務(wù)類業(yè)務(wù)
- * @author hoojo
- * @createDate 2011-6-7 下午02:12:47
- * @file ChatService.java
- * @package com.hoo.chat
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
- public class ChatService implements ApplicationContextAware {
- private ApplicationContext ctx;
- public void setApplicationContext(ApplicationContext ctx) throws BeansException {
- this.ctx = ctx;
- }
- /**
- * function: 向服務(wù)器發(fā)送信息,服務(wù)器端監(jiān)聽ChatMessageEvent事件,當(dāng)有事件觸發(fā)就向所有客戶端發(fā)送信息
- * @author hoojo
- * @createDate 2011-6-8 下午12:37:24
- * @param msg
- */
- public void sendMessage(Message msg) {
- //發(fā)布事件
- ctx.publishEvent(new ChatMessageEvent(msg));
- }
- }
上面的sendMessage需要瀏覽器客戶端調(diào)用此方法完成消息的發(fā)布,傳遞一個(gè)Message對(duì)象,并且是觸發(fā)ChatMessageEvent事件。
#p#
4、 編寫監(jiān)聽器監(jiān)聽客戶端是否觸發(fā)ChatMessageEvent
- package com.hoo.chat;
- import java.util.Collection;
- import java.util.Date;
- import javax.servlet.ServletContext;
- import org.directwebremoting.ScriptBuffer;
- import org.directwebremoting.ScriptSession;
- import org.directwebremoting.ServerContext;
- import org.directwebremoting.ServerContextFactory;
- import org.springframework.context.ApplicationEvent;
- import org.springframework.context.ApplicationListener;
- import org.springframework.web.context.ServletContextAware;
- import com.hoo.entity.Message;
- /**
- * function:監(jiān)聽客戶端事件,想客戶端推出消息
- * @author hoojo
- * @createDate 2011-6-7 上午11:33:08
- * @file SendMessageClient.java
- * @package com.hoo.util
- * @project DWRComet
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
- @SuppressWarnings("unchecked")
- public class ChatMessageClient implements ApplicationListener, ServletContextAware {
- private ServletContext ctx;
- public void setServletContext(ServletContext ctx) {
- this.ctx = ctx;
- }
- @SuppressWarnings("deprecation")
- public void onApplicationEvent(ApplicationEvent event) {
- //如果事件類型是ChatMessageEvent就執(zhí)行下面操作
- if (event instanceof ChatMessageEvent) {
- Message msg = (Message) event.getSource();
- ServerContext context = ServerContextFactory.get();
- //獲得客戶端所有chat頁(yè)面script session連接數(shù)
- Collection
- 昵稱:
- 消息:


咨詢
建站咨詢