转:

dwr实现聊天室功能

2016年01月15日 10:22:43 我爱喝可乐 阅读数:564
 

用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种。通常我们要实现无刷新,一般会使用到Ajax。Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔若干秒时间向服务器发出轮询以进行更新,另一种方法是服务器始终打开与浏览器的连接并在数据可用时发送给浏览器。第一种方法一般利用setTimeout或是setInterval定时请求,并返回最新数据,这无疑增加了服务器的负担,浪费了大量的资源。而第二种方法也会浪费服务器资源,长期的建立连接;而相对第一种来说,第二种方式会更优于第一种方法;这里有一个一对多和多对一的关系,而comet向多个客户端推送数据就是一对多的关系。而具体使用哪种方式,要看你当前的需求而定,没有绝对的。

为什么使用Comet?

轮询方法的主要缺点是:当扩展到更多客户机时,将生成大量的通信量。每个客户机必须定期访问服务器以检查更新,这为服务器资源添加了更多负荷。最坏的一种情况是对不频繁发生更新的应用程序使用轮询,例如一种 Ajax 邮件 Inbox。在这种情况下,相当数量的客户机轮询是没有必要的,服务器对这些轮询的回答只会是 “没有产生新数据”。虽然可以通过增加轮询的时间间隔来减轻服务器负荷,但是这种方法会产生不良后果,即延迟客户机对服务器事件的感知。当然,很多应用程序可以实现某种权衡,从而获得可接受的轮询方法。

尽管如此,吸引人们使用 Comet 策略的其中一个优点是其显而易见的高效性。客户机不会像使用轮询方法那样生成烦人的通信量,并且事件发生后可立即发布给客户机。但是保持长期连接处于打开状态也会消耗服务器资源。当等待状态的 servlet 持有一个持久性请求时,该 servlet 会独占一个线程。这将限制 Comet 对传统 servlet 引擎的可伸缩性,因为客户机的数量会很快超过服务器栈能有效处理的线程数量。

如果本示例结合Jetty应用服务器效果会更好。

开发环境:

System:Windows

WebBrowser:IE6+、Firefox3+

JavaEE Server:tomcat5.0.2.8、tomcat6

IDE:eclipse、MyEclipse 8

开发依赖库:

JavaEE5、Spring 3.0.5、dwr 3

Email:hoojo_@126.com

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

一、准备工作

1、 下载dwr的相关jar包

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

程序中还需要spring的相关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. <--><listener><listener-class></listener-class></listener><--><context-param><param-name></param-name><param-value></param-value></context-param><listener><listener-class></listener-class></listener><servlet><servlet-name></servlet-name><servlet-class></servlet-class><init-param><param-name></param-name><param-value></param-value></init-param><--><init-param><param-name></param-name><param-value></param-value></init-param></servlet><servlet-mapping><servlet-name></servlet-name><url-pattern></url-pattern></servlet-mapping>

3、 在src目录加入applicationContext-beans.xml配置,这个配置专门配置bean对象,用来配置需要注入的对象。

  1. <?xml= =?><beans=
  2. =
  3. =
  4. =
  5. =
  6. =
  7. ="http://www.springframework.org/schema/beans
  8. ></beans>

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

  • <? = =?>><></>

以上的准备基本完毕,下面来完成无刷新聊天室代码

1、 聊天实体类Model

  1. packageimport * <b>function:</b>
  2. * @author hoojo
  3. * @createDate 2011-6-3 下午06:40:07
  4. * @file Message.java
  5. * @package com.hoo.entity
  6. * @project DWRComet
  7. * @blog http://blog.csdn.net/IBM_hoojo
  8. * @email hoojo_@126.com
  9. * @version 1.0
  10. */publicclassprivateintprivateprivate
  11. }

2、 编写聊天信息的事件

  1. packageimport * <b>function:</b>发送聊天信息事件
  2. * @author hoojo
  3. * @createDate 2011-6-7 上午11:24:21
  4. * @file MessageEvent.java
  5. * @package com.hoo.util
  6. * @project DWRComet
  7. * @blog http://blog.csdn.net/IBM_hoojo
  8. * @email hoojo_@126.com
  9. * @version 1.0
  10. */publicclassextendsprivatestaticfinallongpublicsuper}

继承ApplicationEvent,构造参数用于传递发送过来的消息。这个事件需要一个监听器监听,一旦触发了这个事件,我们就可以向客户端发送消息。

3、 发送消息服务类,用户客户端发送消息。dwr需要暴露这个类里面的发送消息的方法

  1. packageimportimportimportimport * <b>function:</b>客户端发消息服务类业务
  2. * @author hoojo
  3. * @createDate 2011-6-7 下午02:12:47
  4. * @file ChatService.java
  5. * @package com.hoo.chat
  6. * @project DWRComet
  7. * @blog http://blog.csdn.net/IBM_hoojo
  8. * @email hoojo_@126.com
  9. * @version 1.0
  10. */publicclassimplementsprivatepublicvoidthrowsthis     * <b>function:</b> 向服务器发送信息,服务器端监听ChatMessageEvent事件,当有事件触发就向所有客户端发送信息
  11. * @author hoojo
  12. * @createDate 2011-6-8 下午12:37:24
  13. * @param msg
  14. */publicvoid
  15. new}

上面的sendMessage需要浏览器客户端调用此方法完成消息的发布,传递一个Message对象,并且是触发ChatMessageEvent事件。

4、 编写监听器监听客户端是否触发ChatMessageEvent

  1. packageimportimportimportimportimportimportimportimportimportimportimport * <b>function:</b>监听客户端事件,想客户端推出消息
  2. * @author hoojo
  3. * @createDate 2011-6-7 上午11:33:08
  4. * @file SendMessageClient.java
  5. * @package com.hoo.util
  6. * @project DWRComet
  7. * @blog http://blog.csdn.net/IBM_hoojo
  8. * @email hoojo_@126.com
  9. * @version 1.0
  10. */()
  11. publicclassimplementsprivatepublicvoidthis()
  12. publicvoid
  13. ifinstanceof
  14. );
  15. fornew + (time.getMonth() + ) +  +  time.getDate() +  + time.getMinutes() +  + time.getSeconds();
  16. );
  17. }

上面的代码主要是监听客户端的事件,一旦客户端有触发ApplicationEvent事件或是其子类,就会执行onApplicationEvent方法。代码中通过instanceof判断对象实例,然后再执行。如果有触发ChatMessageEvent事件,就获取所有连接chat.jsp这个页面的ScriptSession。然后像所有的ScriptSession中添加script。这样被添加的ScriptSession就会在有连接chat.jsp的页面中执行。

所以这就是客户端为什么会执行服务器端的JavaScript代码。但前提是需要在web.xml中添加dwrComet配置以及在chat页面添加ajax反转。

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

applicationContext-beans.xml配置

  1. <bean= =/><bean= =/>

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

dwr.xml配置

  1. <allow><convert= =><param= = /></convert><create= =><param= = /></create></allow>

charService的sendMessage方法传递的是Message对象,所以要配置Message对象的convert配置。

上面的create的creator是spring,表示在spring容器中拿chatService对象。里面的参数的beanName表示在spring容器中找name等于charService的bean对象。

6、 客户端chat.jsp页面代码

  1. <= = =%>< = .getContextPath();
  2. = .getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  3. >><html><head><base=><title></title><meta= =><meta= =><meta= =><script= =></script><script= =></script><script= =></script><script=> =  Date();
  4. = .util.getValue("content");
  5. = .util.getValue("userName");
  6. = (encodeURI(name + " say:\n" + content));
  7. = {"msg": info, "time": time};
  8. = (decodeURI(data.msg));
  9. = .util.getValue("info");
  10. </script></head><body=><textarea= = = =></textarea><hr/><input= =/><br/><textarea= = =></textarea><input= == =/></body></html>

首先,你需要导入dwr的engine.js文件,这个很重要,是dwr的引擎文件。其次你使用的那个类的方法,也需要在导入进来。一般是interface下的,并且在dwr.xml中配置过的create。

上面的js中调用的charService类中的sendMessage方法,所以在jsp页面中导入的是ChatService.js。

在body的onload事件中,需要设置反转Ajax,这个很重要。

showMessage是ChatMessageClient的onApplicationEvent方法中的appendScript中需要执行的方法。data参数也是在那里传递过来的。

每当发送sendMessage方法后就会触发ChatMessageEvent事件,然后监听的地方就会执行onApplicationEvent方法,在这个方法中又会执行浏览器中的showMessage方法。

我在项目中实际的是以这个为根据,然后自己修改的

dwr网上使用例子的更多相关文章

  1. DWR入门的例子(一个)

    DWR(Direct Web Remoting)是WEB远程调用框架.使用这种框架使AJAX发展至今已成为非常easy.使用DWR能client利用JavaScript直接调用服务端的Java方法并返 ...

  2. Ajax框架,DWR介绍,应用,例子

    使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 常用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax提供 ...

  3. dwr框架介绍

    转: [DWR框架]过时了吗? 置顶 2018年06月02日 11:59:02 许你笑颜 阅读数:4129   版权声明: https://blog.csdn.net/smileyan9/articl ...

  4. dwr框架中DWRUtil的方法

    dwr框架中DWRUtil的方法 2008-10-14 17:57:23|  分类: JAVA |  标签: |举报 |字号大中小 订阅     7. util.js 功能 util.js包含了一些工 ...

  5. xfire webServeic 例子

    xfire webServeic 例子,参考网上众多例子,自己写得完成了,给大家分享 大家只要按这个目录去建文件就可以了,然后运行,至于其中原理慢慢理会吧 环境:myeclipse 10 +xfire ...

  6. Android调用天气预报的WebService简单例子

    下面例子改自网上例子:http://express.ruanko.com/ruanko-express_34/technologyexchange5.html 不过网上这个例子有些没有说明,有些情况不 ...

  7. PL/pgSQL的 RETURN NEXT例子

    从网上找到例子: 可以说,RETURN NEXT要用在循环中: 例子一: 数据准备: CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT); ...

  8. ViewPager的简单例子

    这个例子是按照官网上的例子写的,有点抄袭的嫌疑,但是自己单独写一下会加深自己的印象. 首先是MainAcitivity.xml: <LinearLayout xmlns:android=&quo ...

  9. macaca测试web小例子

    上午刚把macaca的环境在公司的电脑上吧web 端的环境给搭建好,于是乎,看看网上的例子,看看官方的文档 https://macacajs.github.io/wd.py/ 可以在这个链接看到原滋原 ...

随机推荐

  1. 20155323刘威良《网络对抗》Exp7 网络欺诈防范

    20155323刘威良<网络对抗>Exp7 网络欺诈防范 实践目标 理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实践内容 (1)简单应用SET工具建立冒名网站 (1分 ...

  2. mfc CListBox

    通过ID操作对象 CListBox(列表框)控件 CListBox类常用成员 CListBox插入数据 CListBox删除数据 CListBox运用示例 一.CListBox类常用成员 CListB ...

  3. mfc 重载赋值运算符

    重载赋值运算符= 一.重载运算符格式 返回类型 operator 运算符 (参数); 如: bool operator=(char*s); int operator>(char*s); bool ...

  4. 在sourceinsight中添加快速注释 Ctrl+/

    1.搜索文件:utils.em(C:\Program Files (x86)\Source Insight 3)2.用sourceinsight打开文件:utils.em3.在文件末尾添加下面代码 m ...

  5. stl源码剖析 详细学习笔记 算法(1)

    //---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都 ...

  6. 01.如何把.py文件打包成为exe,重点讲解pyinstaller的用法

    1.应用场景 1.1 故事背景 我自己用python写了一个小程序发给其他同事用,给他的就是一个.py文件,不过他觉得比较麻烦,还要安装环境,他问我有没有简单一点的方式,我给一个exe文件,他就不用安 ...

  7. NAND Flash底层原理,SLC MLC TLC比较

    NAND-Flash 的存储原理 固态硬盘最小单元的基本架构如下: 我们知道计算机中所有的信息储存最终都必须回归到 0与1,原则上,只要存储单元能提供两种或两种以上可供辨识的状态,便可以拿来纪录数据. ...

  8. centos7 源码部署LNMP

    一.环境 系统环境:centos 7.4 64位 Nginx:1.7.9 MySQL: 5.7.20 (二进制包) PHP:5.6.37 二.Ngin 安装 Nginx部署 yum install   ...

  9. Jmeter(四)_16个逻辑控制器详解

    循环控制器: 指定其子节点运行的次数,可以使用具体的数值,也可以设置为变量 1:勾选永远:表示一直循环下去 2:如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两 ...

  10. Word或者WPS里证件照的背景底色和像素调整

    证件照的背景底色调整和像素调整         关于证件照的背景底色自行调整,比较方便的方法是用Word或者WPS来进行调整,当然也可以利用两者相结合的方法来进行调整,下面来系统的说一下这两种方式.此 ...