DWR3实现服务器端向客户端精确推送消息

原贴地址:http://blog.csdn.net/luojia_wang/article/details/8825929

研究了一天半,终于模拟出了这个功能,网上DWR的资料不少,但是真正实现客户端向服务器端精确推送消息的只有两篇文章。但是代码都只有一部分,向我这种刚开始学习DWR的人来说要看懂真的蛮难。不过即便如此,http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人。只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始:

第一、在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下:

Java代码

  1. <servlet>
  2. <servlet-name>dwr-invoker</servlet-name>
  3. <servlet-class>
  4. org.directwebremoting.servlet.DwrServlet
  5. </servlet-class>
  6. <init-param>
  7. <param-name>crossDomainSessionSecurity</param-name>
  8. <param-value>false</param-value>
  9. </init-param>
  10. <init-param>
  11. <param-name>allowScriptTagRemoting</param-name>
  12. <param-value>true</param-value>
  13. </init-param>
  14. <init-param>
  15. <param-name>classes</param-name>
  16. <param-value>java.lang.Object</param-value>
  17. </init-param>
  18. <init-param>
  19. <param-name>activeReverseAjaxEnabled</param-name>
  20. <param-value>true</param-value>
  21. </init-param>
  22. <init-param>
  23. <param-name>initApplicationScopeCreatorsAtStartup</param-name>
  24. <param-value>true</param-value>
  25. </init-param>
  26. <init-param>
  27. <param-name>maxWaitAfterWrite</param-name>
  28. <param-value>3000</param-value>
  29. </init-param>
  30. <init-param>
  31. <param-name>debug</param-name>
  32. <param-value>true</param-value>
  33. </init-param>
  34. <init-param>
  35. <param-name>logLevel</param-name>
  36. <param-value>WARN</param-value>
  37. </init-param>
  38. </servlet>

第二:在web.xml的同级目录下新建dwr.xml文件,内容如下

Java代码

  1. <!DOCTYPE dwr PUBLIC
  2. "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
  3. "http://getahead.org/dwr/dwr30.dtd">
  4. <dwr>
  5. <alow>
  6. <create creator="new" javascript="MessagePush">
  7. <param name="class" value="com.huatech.messageremind.service.MessagePush"/>
  8. </create>
  9. <create creator="new" javascript="TestPush">
  10. <param name="class" value="com.huatech.messageremind.service.Test"/>
  11. </create>
  12. </alow>
  13. </dwr>

这个是dwr的基本配置,MessagePush在页面的javascript中使用,这个是对被推送页面开放的java类,Test是对推送页面开放的java类。场景:管理员后台登陆,发布一条消息,通过Test推送到后台,后台通过MessagePush推送给指定的用户,当然,至于怎么找到指定的用户,下面会说。

第三,被推送的页面代码

Java代码

  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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>DWR  DEMO</title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. </head>
  17. <script type=‘text/javascript‘ src=‘dwr/engine.js‘></script>
  18. <script type=‘text/javascript‘ src=‘dwr/util.js‘></script>
  19. <script type="text/javascript" src="dwr/interface/MessagePush.js"></script>
  20. <script type="text/javascript">
  21. //通过该方法与后台交互,确保推送时能找到指定用户
  22. function onPageLoad(){
  23. var userId = ‘${userinfo.humanid}‘;
  24. MessagePush.onPageLoad(userId);
  25. }
  26. //推送信息
  27. function showMessage(autoMessage){
  28. alert(autoMessage);
  29. }
  30. </script>
  31. <body onload="onPageLoad();dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);;">
  32. This is my DWR DEOM page. <hr>
  33. <br>
  34. <div id="DemoDiv">demo</div>
  35. </body>
  36. </html>

以上代码的简单解释:

页面页面onload的3个函数都是必须的,后两个是dwr的,第一个是将登录用户的userid与对应   的scriptSession进行处理,以便精确推送的时候能找到推送对象

第四 MessagePush类中实现的方法如下:

Java代码

  1. public void onPageLoad(String userId) {
  2. ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
  3. scriptSession.setAttribute(userId, userId);
  4. DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();
  5. try {
  6. dwrScriptSessionManagerUtil.init();
  7. System.out.println("cacaca");
  8. } catch (ServletException e) {
  9. e.printStackTrace();
  10. }
  11. }

里面对应的DwrScriptSessionManagerUtil 对应如下:

Java代码

  1. import javax.servlet.ServletException;
  2. import javax.servlet.http.HttpSession;
  3. import org.directwebremoting.Container;
  4. import org.directwebremoting.ServerContextFactory;
  5. import org.directwebremoting.WebContextFactory;
  6. import org.directwebremoting.event.ScriptSessionEvent;
  7. import org.directwebremoting.event.ScriptSessionListener;
  8. import org.directwebremoting.extend.ScriptSessionManager;
  9. import org.directwebremoting.servlet.DwrServlet;
  10. public class DwrScriptSessionManagerUtil extends DwrServlet{
  11. private static final long serialVersionUID = -7504612622407420071L;
  12. public void init()throws ServletException {
  13. Container container = ServerContextFactory.get().getContainer();
  14. ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);
  15. ScriptSessionListener listener = new ScriptSessionListener() {
  16. public void sessionCreated(ScriptSessionEvent ev) {
  17. HttpSession session = WebContextFactory.get().getSession();
  18. String userId =((User) session.getAttribute("userinfo")).getHumanid()+"";
  19. System.out.println("a ScriptSession is created!");
  20. ev.getSession().setAttribute("userId", userId);
  21. }
  22. public void sessionDestroyed(ScriptSessionEvent ev) {
  23. System.out.println("a ScriptSession is distroyed");
  24. }
  25. };
  26. manager.addScriptSessionListener(listener);
  27. }
  28. }

第五 推送页面代码:

Java代码

  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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP ‘MyJsp.jsp‘ starting page</title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.5.1.js"></script>
  17. <script type=‘text/javascript‘ src=‘dwr/engine.js‘></script>
  18. <script type=‘text/javascript‘ src=‘dwr/util.js‘></script>
  19. <script type=‘text/javascript‘ src=‘dwr/interface/TestPush.js‘></script>
  20. <script type="text/javascript">
  21. function test() {
  22. var msg = document.getElementById("msgId").value;
  23. //msg = {msgId: ‘1‘, context: $("#msgContext").val()};
  24. TestPush.sendMessageAuto(msg,"哈哈哈");
  25. }
  26. </script>
  27. </head>
  28. <body>
  29. id&nbsp;&nbsp;&nbsp;&nbsp;: <input type="text" name="msgId" id="msgId" /> <br />
  30. <input type="button" value="Send" onclick="test()"  />
  31. </body>
  32. </html>

第六:精确推送要实现的代码:

Java代码

  1. public class Test{
  2. public void sendMessageAuto(String userid, String message){
  3. final String userId = userid;
  4. final String autoMessage = message;
  5. Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
  6. public boolean match(ScriptSession session){
  7. if (session.getAttribute("userId") == null)
  8. return false;
  9. else
  10. return (session.getAttribute("userId")).equals(userId);
  11. }
  12. }, new Runnable(){
  13. private ScriptBuffer script = new ScriptBuffer();
  14. public void run(){
  15. script.appendCall("showMessage", autoMessage);
  16. Collection<ScriptSession> sessions = Browser
  17. .getTargetSessions();
  18. for (ScriptSession scriptSession : sessions){
  19. scriptSession.addScript(script);
  20. }
  21. }
  22. });
  23. }
  24. }

至此   这个例子的代码都已经贴出来了,应该是可以跑通的,有问题的话可以给我留言。当然,要自己写个登录,然后把userId放到session里面,这个比较简单,就不贴代码了,有问题可以在http://download.csdn.net/detail/luojia_wang/5275588上下载原项目。我只是简单的做了一个能实现功能的例子,还有很多地方要研究,比如跟spring整合,还可能有很多优化,等我继续学习一下再说.

时间: 2024-07-29 14:33:38

DWR3实现服务器端向客户端精确推送消息的相关文章

dwr3实现消息精确推送详细步骤

最近项目中需要用到推送消息,找了很久终于找到一篇不错的文章,方便以后查看就转载了,也分享给大家,希望能帮到有需要的人. 第一.在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class> org.directwebremoting.servlet.DwrServlet </servlet-class> &

使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言

链接网址:http://www.cnblogs.com/yangwujun/p/5973120.html 在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret,可以在极光官网www.jpush.cn申请.web.config源码: <?xml version="1.0"?> <!-- 有关如何配置 ASP.NET 应用程序

hbuilder APP服务器端(C#)推送

 实现推送有多种方法和技术手段,我这边是使用三方"个推"去实现对特定用户的推送.我自己是关联业务,对下一步任务代办人进行消息通知.   1 .个推账号申请和配置 1.1.IOS需要推送证书 参考网址:http://www.applicationloader.net/blog/zh/397.html 1.2 ."Hbuilder"" 个推"配置参考:http://ask.dcloud.net.cn/article/34 2.代码处理 2.1 C#后

WebSocket 实现服务端给客户端推送消息

目录 代码发布 应用场景 ajax 操作 队列 递归 如何实现服务端主动给客户端推送消息的效果 长轮询(兼容性好) websocker(主流浏览器都支持) 代码验证(了解) 代码发布 服务端主动给客户端推送消息 截至目前为止,我们所写的 web 项目基本都是基于 HTTP 协议的 HTTP 协议有四大特性:无链接 基于 HTTP 协议实现服务端主动给客户端推送消息好像有点麻烦--- 我们都经历过,浏览器打开一个网站不动,网站过一会儿自动弹出消息 再比如网页版本的微信和 qq,我们所有人创建一个群

DWR实现服务器向客户端推送消息

原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人.只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始: 第一.在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下: <servlet> <servlet-name>dwr-invoker</servle

(转)移动端主动推送消息原理

转:https://www.zhihu.com/question/19628406/answer/77205019 一.服务端主动推送消息到客户端过程 作者:谢泽帆   李琰链接:https://www.zhihu.com/question/24938934/answer/85359794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 服务端主动推送到客户端是怎么一个过程 目前服务端给客户端推送,普遍做法是客户端与服务端维持一个长连接,客户端定时向服务端发送心跳以

搭建XMPP协议,实现自主推送消息到手机

参考网址: http://www.devdiv.com/thread-101586-1-1.html 关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的C2DM,具体不细说,缺点,服务器在国外,你懂得,不是很稳定.3.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性.它的特点是将复杂性从客户端转移到了服务器端.听说GTalk.

搭建xmpp推送消息到手机

关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的C2DM,具体不细说,缺点,服务器在国外,你懂得,不是很稳定.3.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性.它的特点是将复杂性从客户端转移到了服务器端.听说GTalk.QQ.IM等都用这个协议. 接下来说说XMPP在android客户端上的应用.分两部分:服务端搭建和客

ios如何实现远程推送消息

远程推送可以解决 当用户关闭程序的时候 不能收到推送消息.当客户端使用了远程推送的功能,不管用户有没有关闭程序,都能收到 服务器推送的消息. 苹果实现远程推送 是基于长连接的, 默认情况下 苹果的所有设备都是和 苹果的apns服务器建立长连接的, 只要设备已经联网. 长连接的好处: 苹果服务器可以主动向 客户端发送消息, 也可以找回我的设备(当设备丢失时). 远程推送的步骤: 客户端向苹果服务器获取deviceToken步骤:客户端将 BundleId 和 设备UDID 发送给苹果Apns服务器