`
coach
  • 浏览: 383070 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

基于iframe的HTTP长连接实现

    博客分类:
  • http
阅读更多
关于什么是http长连接我不废吐沫了,有专业的解释(http://www.ibm.com/developerworks/cn/web/wa-lo-comet/)你可以去看看
我们介绍一下在struts下的实现
首先写一个test.jsp(写一些片段)

<html:form action="/myAction" target="myiframe">  
    <%-- 这里写你的页面代码 --%>      
    <center><input type="button" value="测试提交" class="btn4" onClick="javascript:test();"></center>  
</html:form>  
<iframe name="myiframe" id="myiframe" style="display: none" mce_style="display: none"></iframe>  
<mce:script language="JavaScript"><!--   
function orderGen(){   
    document.MyForm.action.value = 'test';   
    document.MyForm.submit();   
}   
function msg(m){   
    alert(m);   
}   
// --></mce:script> 


特别注意‘<html:form action="/myAction" target="myiframe">’中的target属性的值一定要等于form结尾那个iframe的名称(即name属性),这是该实现方式的原理所在,就是说这个MyForm提交服务器后由服务器响应回来的数据填充到这个iframe里面,而这个iframe是不可见的(display: none)。从而实现了提交后页面没有刷新的感觉。
接下来是服务器端的实现

public class MyAction extends DispatchAction{   
    public ActionForward test(ActionMapping mapping, ActionForm actionForm,   
                                  HttpServletRequest request, HttpServletResponse response)   
            throws Exception {   
    String result = "hello I'm server";//要打印到前台的字符   
        sendMsg(result,response,"msg");//msg是test.jsp中的那个js方法的名称   
        return null;//必须返回null   
    }   
    //以下方法的意思是将msg打到前台页面调用前台的“function msg(m)”方法进行显示   
    protected void sendMsg(String msg, HttpServletResponse response, String javascriptMethod) {   
        try {   
            response.setContentType("text/html;charset=GBK");   
            response.getWriter().write(   
                    "<mce:script type="text/javascript"><!--   
parent." + javascriptMethod + "(\"" + msg + "\");   
// --></mce:script>");   
            response.flushBuffer();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
} 

sendMsg这个java生成了一段js代码将服务端的数据展示在了页面,页面会打出一个alert,如果你明白了这个原理那么你可以改写sendMsg和function msg(m),你可以将数据填到一个div中,这个效果就好像ajax一样页面连闪都不闪一下。
接下来实现长连接

public class MyAction extends DispatchAction{   
    public ActionForward test(ActionMapping mapping, ActionForm actionForm,   
                                  HttpServletRequest request, HttpServletResponse response)   
            throws Exception {   
    int i = 0;   
    boolean boo = true;   
    String result = null;   
    while(boo){   
        try {   
                Thread.sleep(1000);   
            } catch (InterruptedException e) {   
                e.printStackTrace();     
            }   
        result = "hello I'm server"+i;//要打印到前台的字符   
        sendMsg(result,response,"msg");//msg是test.jsp中的那个js方法的名称   
        i++;   
        if(i==100){   
            boo = false;   
        }   
    }   
        return null;   
    }   
    //以下方法的意思是将msg打到前台页面调用前台的“function msg(m)”方法进行显示   
    protected void sendMsg(String msg, HttpServletResponse response, String javascriptMethod) {   
        try {   
            response.setContentType("text/html;charset=GBK");   
            response.getWriter().write(   
                    "<mce:script type="text/javascript"><!--   
parent." + javascriptMethod + "(\"" + msg + "\");   
// --></mce:script>");   
            response.flushBuffer();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
}  


不停的做循环操作以求达到长连接,前台会不停的打alert出来,这样做实现了服务器端向客户端推数据,同时服务器端的状态可以实时反映到前台,如果在你的项目中客户点击按钮后服务器将执行大量的长时间的操作的时候而客户又要实时监控操作的情况的时候不妨使用这种方式提升用户体验。随便说一句IE支持这种玩法firefox等浏览器也支持



分享到:
评论
2 楼 cwqcwqmax9 2013-11-29  
写的不对 ,要while 循环来留住respone.
1 楼 wxwyes 2013-08-06  
瞎扯,根本就不行!

相关推荐

    关于心跳程序-Web 通信之长连接、长轮询(long polling)

    资源概要:基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。 本资源介绍了什么是长连接、长轮询以及他们的应用场景和他们的优...

    .net html Iframe框架考勤系统源代码

    布局基于HTML Iframe框架制作 网站美观 可实现基本考勤功能 查询记录 按条件查询记录 考勤记录 考勤管理 导出EXCEL等等 代码简单易懂 修改方便 适合低中级程序员进行学习 有能力的可继续扩展 网站主要以学校考勤为...

    springws:基于SpringMVC实现的WebSocket工程实例

    Spring-ws基于SpringMVC实现的支持SockJS的WebSocket工程实例说明本项目为maven项目,使用SpringMVC实现,用于展示如果使用 SockJS。项目启动后直接打开对应的端口在首页就可以看到展示的功能。后端在"/echo"上添加...

    WebSocket协议中文版.pdf

    WebSocket协议实现在受控环境中运行不受信任代码的一个...该技术的目标是为需要与服务器全双工通信且不需要依赖打开多个HTTP连接(例如,使用XMLHttpRequest或&lt;iframe&gt;和长轮询)的基于浏览器应用的提供一种机制。

    websocket demo

    WebSocket协议是基于TCP的一种新的... 该技术的目标是为基于浏览器的、需要和服务器进行双向通信的(服务器不能依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或&lt;iframe&gt;和长轮询))应用程序提供一种通信机制。

    模仿Windows桌面特效代码.rar

    模仿Windows桌面特效代码基于jquery.tool.js实现的类似windows桌面及iframe特效代码,是一段模仿windows桌面效果编写的代码,该代码可以实现图标排列,及打开图标iframe调用出想用连接的效果,同时拥有windows任务栏...

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 recv与recvfrom的区别及基于udp实现ntp服务 08 基于tcp实现远程执行命令 09 基于tcp实现远程执行命令测试结果 10 粘包现象 11 粘包解决方法 第31章 01 上节课复习 02 socketserver实现并发 03 socketserver模块...

    ExtAspNet_v2.3.2_dll

    注:ExtAspNet基于一些开源的程序ExtJS, HtmlAgilityPack, Nii.JSON, YUICompressor。 示例: http://extasp.net/ 开源: http://extaspnet.codeplex.com/ 博客: http://sanshi.cnblogs.com/ 邮箱: sanshi.ustc@gmail...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    基于DjangoORM的外键实现增加用户(含select标签) 作业 第20周 课程安排 上课内容回顾 Django一对多的创建 创建一对多表结构 获取单表单数据的三种方式 一对多跨表操作 一对多块表操作的的三种方式 增加一对多...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    注:ExtAspNet基于一些开源的程序ExtJS, HtmlAgilityPack, Nii.JSON, YUICompressor。 示例: http://extasp.net/ 开源: http://extaspnet.codeplex.com/ 博客: http://sanshi.cnblogs.com/ 邮箱: sanshi.ustc@gmail...

    C#编程经验技巧宝典

    43 &lt;br&gt;0061 树的实现 44 &lt;br&gt;3.2 排序 48 &lt;br&gt;0062 如何实现选择排序算法 48 &lt;br&gt;0063 如何实现冒泡排序算法 49 &lt;br&gt;0064 如何实现快速排序算法 50 &lt;br&gt;0065 如何实现插入排序算法 ...

    JavaScript基础和实例代码

    1.8 JavaScript的实现基础 1.8.1 ECMAScript 1.8.2 DOM 1.8.3 BOM 1.9 客户端与服务器端脚本 1.10 JavaScript与JScript、 VBScript 1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第...

    源文件程序天下JAVASCRIPT实例自学手册

    1.8 JavaScript的实现基础 1.8.1 ECMAScript 1.8.2 DOM 1.8.3 BOM 1.9 客户端与服务器端脚本 1.10 JavaScript与JScript、 VBScript 1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第...

    网际畅游 MyIE 3.0 源代码

    你也可以将某个Frame或IFrame的URL加入窗口过滤器,这个Frame或IFrame以后就不会下载了。 使用*过滤窗口:在过滤广告窗口时可以在URL中使用*来过滤一批相似的地址。但你可不要用*把所有的窗口都过滤掉哦! ...

    discuz 2.2Fsp1插件加强版

    基于2.2Fsp1所以补丁就不用说了 希望各位朋友在使用过程中做好我们社区的友情链接,尊重别人劳动成功~谢谢 增加权限查看 无用数据清理 注册等10秒看许可协议时间修改为0 子论坛显示新方式...

    VeryIDE Bee 互动营销**台 v1.5 UTF-8.rar

    增加 针对 PHPWind 8.7 禁用 IFrame 的问题,特别新增 UBB 调用表单引用代码,感谢 大唐网 提供建议 增加 表单新增用户选项组数据"显示到结果页"功能,感谢 大舟山网 提供建议 增加 "意见反馈"模块,可以应用于全...

    html入门到放弃笔记

    1、特殊文本的实现 页面的空格以及一些特殊字符需要通过转义字符的方式体现 1、&nbsp; 表示一个空格 2、&lt; 表示 &lt; 3、&gt; 表示 &gt; 4、&copy; 表示© Demo : 1、创建一个页面 02-text.html 2、在页面...

Global site tag (gtag.js) - Google Analytics