文档章节

DWR(三)使用comet实现的一个页面聊天的私聊

小老傅
 小老傅
发布于 2013/10/27 10:21
字数 563
阅读 1919
收藏 28

<p>DWR的comet的实质,就是在我们的页面进行加载的时候,或者是我们的鼠标的移动,键盘的敲击触发事件引起一个隐形的客户端向服务器的请求,这个请求是一个相当于是一次大话的拨打,只是对方那里没有给出一个相应的回应,从而我们的通信服务方也不会给我们转发信息,但是这个电话是一直保持开着的,也就是说一旦对方有话说的时候,我们是可以被服务器通知的。</p> <p>下面是我们的测试时候的后台的</p> <h2>java的</h2> <p>代码:</p> <blockquote> <p>package com.fww.service;</p> <p>import org.directwebremoting.ScriptBuffer; <br />import org.directwebremoting.ScriptSession; <br />import org.directwebremoting.ScriptSessions; <br />import org.directwebremoting.WebContext; <br />import org.directwebremoting.WebContextFactory;</p> <p>public class Test { <br />&#160;&#160;&#160; public void test(String msg) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(msg); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; WebContext context = WebContextFactory.get(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ScriptSession scriptSession = context.getScriptSession(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ScriptBuffer buffer = new ScriptBuffer(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; buffer.appendScript(&quot;showMsg('&quot; + msg + &quot;');&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />//&#160;&#160;&#160;&#160;&#160;&#160;&#160; scriptSession.addScript(buffer); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ScriptSessions.addScript(buffer); <br />&#160;&#160;&#160; } <br />} <br /></p> </blockquote> <p>需要在我们的</p> <h2>web.xml</h2> <p>中进行的配置,告诉我们的服务器,这里的配置需要做一个相应的操作:</p> <blockquote></blockquote> <blockquote> <p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; <br />&lt;web-app version=&quot;2.5&quot; <br />&#160;&#160;&#160; xmlns=&quot;<a href="http://java.sun.com/xml/ns/javaee&quot;">http://java.sun.com/xml/ns/javaee&quot;</a> <br />&#160;&#160;&#160; xmlns:xsi=&quot;<a href="http://www.w3.org/2001/XMLSchema-instance&quot;">http://www.w3.org/2001/XMLSchema-instance&quot;</a> <br />&#160;&#160;&#160; xsi:schemaLocation=&quot;<a href="http://java.sun.com/xml/ns/javaee">http://java.sun.com/xml/ns/javaee</a> <br />&#160;&#160;&#160; <a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;</a>&gt; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; &lt;servlet&gt; <br />&#160; &lt;display-name&gt;DWR Servlet&lt;/display-name&gt; <br />&#160; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;&#160; <br />&#160; &lt;servlet-class&gt;org.directwebremoting.servlet.DwrServlet&lt;/servlet-class&gt; <br />&#160; &lt;init-param&gt; <br />&#160;&#160;&#160;&#160; &lt;param-name&gt;debug&lt;/param-name&gt; <br />&#160;&#160;&#160;&#160; &lt;param-value&gt;true&lt;/param-value&gt; <br />&#160; &lt;/init-param&gt; <br />&#160; &lt;init-param&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;param-name&gt;activeReverseAjaxEnabled&lt;/param-name&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;param-value&gt;true&lt;/param-value&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/init-param&gt; <br />&#160; <br />&lt;/servlet&gt;</p> <p>&lt;servlet-mapping&gt; <br />&#160; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />&#160; &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; <br />&#160; &lt;welcome-file-list&gt; <br />&#160;&#160;&#160; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt; <br />&#160; &lt;/welcome-file-list&gt; <br />&lt;/web-app&gt; <br /></p> </blockquote> <p>在</p> <h2>dwr.xml</h2> <p>中的基本的配置是不变的:</p> <blockquote> <p>&lt;!DOCTYPE dwr PUBLIC <br />&#160;&#160;&#160; &quot;-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN&quot; <br />&#160;&#160;&#160; &quot;<a href="http://getahead.org/dwr/dwr30.dtd&quot;">http://getahead.org/dwr/dwr30.dtd&quot;</a>&gt;</p> <p>&lt;dwr&gt; <br />&#160; &lt;allow&gt; <br />&#160; <br />&#160;&#160;&#160; &lt;create creator=&quot;new&quot; javascript=&quot;ccc&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;param name=&quot;class&quot; value=&quot;com.fww.service.Test&quot;/&gt; <br />&#160;&#160;&#160; &lt;/create&gt; <br />&#160;&#160;&#160;&#160; <br /> <br />&#160; &lt;/allow&gt; <br />&lt;/dwr&gt;</p> </blockquote> <p>写我们的测试的</p> <h2>jsp</h2> <p>页面:</p> <blockquote> <p>&lt;%@ page language=&quot;java&quot; import=&quot;java.util.*&quot; pageEncoding=&quot;UTF-8&quot;%&gt; <br />&lt;% <br />String path = request.getContextPath(); <br />String basePath = request.getScheme()+&quot;://&quot;+request.getServerName()+&quot;:&quot;+request.getServerPort()+path+&quot;/&quot;; <br />%&gt;</p> <p>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt; <br />&lt;html&gt; <br />&#160; &lt;head&gt; <br />&#160;&#160;&#160; &lt;base href=&quot;&lt;%=basePath%&gt;&quot;&gt; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; &lt;title&gt;My JSP 'index.jsp' starting page&lt;/title&gt; <br />&#160;&#160;&#160; &lt;meta http-equiv=&quot;pragma&quot; content=&quot;no-cache&quot;&gt; <br />&#160;&#160;&#160; &lt;meta http-equiv=&quot;cache-control&quot; content=&quot;no-cache&quot;&gt; <br />&#160;&#160;&#160; &lt;meta http-equiv=&quot;expires&quot; content=&quot;0&quot;&gt;&#160;&#160;&#160; <br />&#160;&#160;&#160; &lt;meta http-equiv=&quot;keywords&quot; content=&quot;keyword1,keyword2,keyword3&quot;&gt; <br />&#160;&#160;&#160; &lt;meta http-equiv=&quot;description&quot; content=&quot;This is my page&quot;&gt; <br />&#160;&#160;&#160; &lt;!-- <br />&#160;&#160;&#160; &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;styles.css&quot;&gt; <br />&#160;&#160;&#160; --&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;script type='text/javascript' src='/dwr_003/dwr/interface/ccc.js'&gt;&lt;/script&gt; <br />&#160; &lt;script type='text/javascript' src='/dwr_003/dwr/engine.js'&gt;&lt;/script&gt; <br />&#160; &lt;script type=&quot;text/javascript&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; function fun(){ <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var msg = document.getElementById(&quot;msg&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ccc.test(msg.value); <br />&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160; function showMsg(mm){ <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var msg = document.getElementById(&quot;msg&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(msg.value != mm){ <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; alert(mm); <br />&#160;&#160;&#160;&#160;&#160; } <br />&#160; &lt;/script&gt; <br />&#160; &lt;/head&gt; <br />&#160; <br />&#160; &lt;body onload=&quot;dwr.engine.setActiveReverseAjax(true);&quot;&gt; <br />&#160;&#160;&#160; &lt;input id=&quot;msg&quot;/&gt; <br />&#160;&#160;&#160; &lt;button onclick=&quot;fun();&quot;&gt;test&lt;/button&gt; <br />&#160; &lt;/body&gt; <br />&lt;/html&gt; <br /></p> </blockquote> <p>如此的操作之后,我们可以在两个不同的浏览器中打开jsp进行测试:</p> <h2>分析</h2> <p>程序的执行时这样子,其中我们打开两个浏览器,A和B,在打开的同时,我们隐形的一个操作就是把我们的请求已经打开了,请求打开以后就好比我们的电话已经打通,只是没有对方的相互的交流。然后我们由于点击按钮的操作,使得浏览器做出一个相应,到我们的服务器端,服务器端接受到请求以后,把相应的操作信息进行处理,把信息发给每一个端口打开的浏览器,这样的操作之后,我们就可以发现私聊的原理。</p>

© 著作权归作者所有

共有 人打赏支持
小老傅
粉丝 7
博文 44
码字总数 35819
作品 0
海淀
程序员
私信 提问
加载中

评论(5)

小老傅
小老傅

引用来自“隐心”的评论

使用JsSocket吧,兼容所有浏览器,开发方便,效率极高
地址:http://yisin.88448.com/viewthread.php?tid=39949
隐心
隐心
使用JsSocket吧,兼容所有浏览器,开发方便,效率极高
地址:http://yisin.88448.com/viewthread.php?tid=39949
很菜很菜菜菜
非常游泳
很菜很菜菜菜
asdfasdfasdfasdfsafsadfasdfsa
缓一缓
缓一缓
学习了79
Spring整合DWR comet 实现无刷新 多人聊天室

用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种。通常我们要实现无刷新,一般会使用到Ajax。Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔...

ibm_hoojo
2011/06/08
0
0
dwr comet 推送消息 用户登陆信息改变?? 急!!!!!

使用dwr comet 的推送消息功能实现一对一在线聊天 , 遇到一问题: 当前登陆用户给另外一个用户发送消息时 , 如果 接收用户未打开聊天窗口 ,刷新页面,接收消息的用户的登陆信息会变成发送...

phuizhang
2013/12/23
222
0
初识Comet技术

初识Comet技术一、服务器推送技术概述服务器推送技术(Servers Push)的基础思想是将浏览器主动查询信息改为服务器主动发送信息。服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的...

Airship
2016/10/31
19
1
DWR3.0框架入门(2) —— DWR的服务器推送

在开始本节内容之前,先来了解一下什么是服务器推送技术和DWR的推送方式。 1.服务器推送技术和DWR的推送方式 传统模式的 Web 系统以客户端发出请求、服务器端响应的方式工作,服务端不能主动...

_Core
2013/11/25
0
8
基于dwr2.0的Push推送技术详细解析以及实例

DWR从2.0开始增加了push功能,也就是在异步传输的情况下可以从Web-Server端发送数据到 Browser. 我们知道,Web的访问机制天生是设计用来pull数据的,也就是只允许Browser端主动发起请求,server...

JavaOlder
2013/04/06
0
24

没有更多内容

加载失败,请刷新页面

加载更多

apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
3
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
8
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
3
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
5
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部