zoukankan      html  css  js  c++  java
  • DWR推送技术

    “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语。它是继“Ajax”之后又一个倍受追捧的Web技术。“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系。

    随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大。Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失。

    但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系统的需求。那就是“服务器发起的消息传递”(Server-Initiated Message Delivery)。在很多的应用当中,服务器软件需要向客户端主动发送消息或信息。因为服务器掌握着系统的主要资源,能够最先获得系统的状态变化和事件的发生。当这些变化发生的时候,服务器需要主动的向客户端实时的发送消息。例如股票的变化。在传统的桌面系统这种需求没有任何问题,因为客户端和服务器之间通常存在着持久的连接,这个连接可以双向传递各种数据。而基于HTTP协议的 Web应用却不行。

    开始就简单介绍DWR技术的背景,下面来看下一个简单的Demo

    附上简单的目录结构以及几个重要的代码:

    MessagePush.java

    package com.visec;
    import java.util.Collection;
    import java.util.Date;
    import java.util.concurrent.locks.ReentrantLock;
    import org.directwebremoting.ScriptSession;
    import org.directwebremoting.proxy.dwr.Util;
    import com.sun.org.apache.bcel.internal.generic.DADD;
    import uk.ltd.getahead.dwr.WebContext;
    import uk.ltd.getahead.dwr.WebContextFactory;
    /**
     * MessagePush
     * @author Dana·Li
     */
    @SuppressWarnings({ "unused", "deprecation" })
    public class MessagePush{
        @SuppressWarnings("unchecked")
        public void send(String msg){   
        WebContext webContext = WebContextFactory.get();
        String ip = webContext.getHttpServletRequest().getRemoteAddr().toString();//获取客户端IP
        String page = "/DwrInvoker/index.jsp";               //DWR为项目名称,页面为index.html
        Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(page);        
        Util util = new Util(sessions);
        util.addFunctionCall("dwrtest", ip + ": " + msg);             //dwrtest为javascript函数     
        } 
    }

    当然这里有些会不理解,dwrtst的作用是干嘛的,dwrtest为Javascript函数,后面的Index.jsp中会提到

    dwr.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
        "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
    <dwr>
      <allow>
        <create creator="new" javascript="MessagePush">
            <param name="class" value="com.visec.MessagePush"></param>
        </create>
      </allow>
    </dwr>
    MessagePush的作用是映射生成javascrpt的脚本,即后续的index.jsp中调用的!

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <display-name></display-name>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    
        <servlet>
            <servlet-name>dwr-invoker</servlet-name>
            <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>true</param-value>
            </init-param>
            <init-param>
                <param-name>activeReverseAjaxEnabled</param-name>
                <param-value>TRUE</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>dwr-invoker</servlet-name>
            <url-pattern>/dwr/*</url-pattern>
        </servlet-mapping>
    </web-app>

    index.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>DwrInvoker</title>
    <script type="text/javascript" src="dwr/engine.js"></script>
    <script type="text/javascript" src="dwr/util.js"></script>
    <script type="text/javascript" src="dwr/interface/MessagePush.js"></script>
    <script type="text/javascript">
        function dwrtest(data) {
            document.getElementById("area").innerHTML = document.getElementById("area").innerHTML+ "
    " + data;
        }
        function send(msg) {
            if (event.keyCode == 13) {
                MessagePush.send(msg);
            }
        }
    </script>
    </head>
    <body onload="dwr.engine.setActiveReverseAjax(true);">
        <textarea style=" 800px; height: 600px;" id="area">
    </textarea>
        <br />
        <input type="text" style=" 800px;" id="in"
            onkeyup="send(this.value)" />
    </body>
    </html>

    代码看到这里就可以上先是效果图了!这个图是简单的jpg图

    本案例测试成功后用及时用到项目中:[可能是电脑原因GIF图制作的不怎么清晰,见谅....:)]

    ping设备IP查看设备状态,看是否在线...DWR利用很广泛

    DOS命令下 ping 192.168.4.10 

    然后转到项目中查看是否一致!

    DWR的应用很广泛...类似的,我们抓取后台数据实现实时推送!

    当然看到这里,很多IT同胞就会提出Ajax也可以实现,但是相对比较Ajax呢...

    Ajax 轮询

    Ajax隔一段时间(通常使用JavaScript的setTimeout函数)就去服务器查询是否有改变,从而进行增量式的更新。但是间隔多长时间去查询成了问题,因为性能和即时性造成了严重的反比关系。间隔太短,连续不断的请求会冲垮服务器,间隔太长,务器上的新数据就需要越多的时间才能到达客户机。

    优点:

    a) 不需要太多服务器端的配置。

    b) 降低带宽的负荷(因为服务器返回的不是完整页面)。

     

     

    本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须且在文章页面明显位置给出原文链接Dana、Li(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请留言或加Q群!
  • 相关阅读:
    20200630(A--E)题解 by 王文硕
    20200629(A--E)题解 by 章思航
    GC垃圾回收
    Codeforces Round #629 (Div. 3) A、B、C
    AtomicInteger的Increment方法的自己实现。
    两个线程,一个输出字母一个输出数字,输出A1B2C3....Z26
    NIO记录
    mysql优化相关
    一些Nginx的Linux命令和conf配置文件
    docker记录
  • 原文地址:https://www.cnblogs.com/visec479/p/4123545.html
Copyright © 2011-2022 走看看