基于iframe的HTTP长连接实现

2023-11-08

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

view plaincopy to clipboardprint?
<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">
    <%-- 这里写你的页面代码 --%> 
    <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)。从而实现了提交后页面没有刷新的感觉。
接下来是服务器端的实现

view plaincopy to clipboardprint?
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();  
        }  
    }  

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一样页面连闪都不闪一下。
接下来实现长连接
view plaincopy to clipboardprint?
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();  
        }  
    }  

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等浏览器也支持

 

注意:HTTP 1.1 规范中规定,客户端不应该与服务器端建立超过两个的 HTTP 连接, 新的连接会被阻塞。而 IE 在实现中严格遵守了这种规定。所以不能建立两个以上的长连接。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fhp0917/archive/2009/05/12/4171818.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于iframe的HTTP长连接实现 的相关文章

  • 未捕获的类型错误:无法读取 null 的属性“getElementsByTagName”

    我正在尝试选择元素 getElementsByTagName var tags document body getElementsByTagName 当前尝试使用从现有答案中吸取的经验教训https stackoverflow com qu
  • Powershell 数组到带引号的逗号分隔字符串

    我有一个数组 需要输出到逗号分隔的字符串 但我还需要引号 这是我所拥有的 myArray file1 csv file2 csv a myArray join a 输出为 a最终 file1 csv file2 csv 我想要的输出是 fi
  • java String.format 中的转义格式化字符

    这个问题几乎与这个 Net 问题 https stackoverflow com questions 91362 how to escape brackets in a format string in net除了java 你如何逃脱 1
  • 从异常中提取类和文件名

    是否可以从异常对象中提取类名和文件名 我希望将更好的日志记录集成到我的应用程序中 并且我想包含异常发生位置的详细信息 在 MVC 中 Stacktrace 不返回文件名和类名 我有点不知道在哪里寻找它们 Thanks 您可以创建一个Stac
  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • Notepad++:: 通过正则表达式完全删除包含问号的行

    嗯 我想这就是我的标题 这对于我将要实现的目标来说是不言自明的 这是我当前的文本文件的示例 Diva was the winning song of the Eurovision Song Contest 1998 Who will win
  • 将 char* 转换为字符串 C++

    我知道字符串的起始地址 例如 char buf 和最大长度int l 字符串的 即字符总数小于或等于l 获取值的最简单方法是什么string来自指定的内存段 换句话说 如何实现string retrieveString char buf i
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • SQL Server 转换选择一列并将其转换为字符串

    是否可以编写一条从表中选择列并将结果转换为字符串的语句 理想情况下 我希望有逗号分隔的值 例如 假设 SELECT 语句看起来像这样 SELECT column FROM table WHERE column lt 10 结果是一列包含值的
  • 如何将字符串拆分为新行并保留空白行?

    给出 ruby 代码 aaaa nbbbb n n split n 这输出 aaaa bbbb 我希望输出包含由 n n 我想要的结果是 aaaa bbbb 获得这个确切结果的最简单 最好的方法是什么 我建议使用lines代替split为了
  • 将带撇号的字符串传递给辅助方法无法正确显示

    我正在使用 Rails 教程中的辅助方法 它将两个字符串连接在一起 以便在视图中的标题选择器中使用 它工作得很好 除非字符串中有撇号 当 group name 包含撇号时 结果如下 这是方法 app helpers application
  • iFrame 在 Facebook Canvas 应用程序中显示为空白

    我有一个非常简单的页面 我试图在 Facebook iframe 中查看它 它是一个 Django 视图 但它不依赖于请求是通过 POST 还是 GET 提交 它所做的只是返回一些简单的 HTML 如果我们直接点击链接 它会正确显示 如果在
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 停止视频时隐藏 YouTube iframe 中的“更多视频”

    当用户停止视频时 如何隐藏 Youtube iframe 中的 更多视频 部分 例子 我找不到任何解决方案here https developers google com youtube player parameters 如果您安装了 u
  • 正则表达式排除双空格

    我正在寻找 c asp net 3 5 的正则表达式 如果句子或单词组中存在任何双空格 该正则表达式将会失败 the cat chased the dog true the cat chased the dog false doubles
  • 内联汇编跳转后抛出 C++ 异常

    我有一些奇怪的自修改代码 但其根源是一个非常简单的问题 我希望能够执行jmp or a call 然后从该任意点抛出一个异常并让包含该异常的 try catch 块捕获该异常jmp call 但是当我这样做时 在 gcc 4 4 1 x86
  • 获取插入符位置上的当前单词

    如何通过当前插入符号位置获取 textarrea 中的单词 我尝试了类似的操作 但是这仅返回单词的第一个字母到插入符号位置的字符 例如 如果光标位于fo and o它返回fo并不是foo正如预期的那样 Fo o bar 不等于 bar fo
  • Php mail() vs Yahoo:有人可以简单解释YAHOO从php邮件功能接收邮件所需的步骤吗?

    我已经看到了关于这个主题的数千个类似问题 并且可以肯定的是我知道 标记为重复问题 SO中的事情 然而 仍然不清楚如何或必须做什么 简单来说 才能从 PHP mail 函数接收雅虎收件箱电子邮件 在雅虎网站上 他们提供了一个示例脚本来发送邮件
  • Python 函数可能会引发哪些异常? [复制]

    这个问题在这里已经有答案了 Python 中有什么方法可以确定 内置 函数可能引发哪些异常 例如 文档 http docs python org lib built in funcs html http docs python org li

随机推荐

  • kafka实践(四):kafka使用之中的一些关注点

    预占位 本章将针对这些关注点进行一些实践 1 同步和异步发送 2 分区 组概念 3 系统自动负载分担机制 4 人为指定负载分担 5 自身的局限有哪些 6 主要的应用场景
  • linus基础命令

    Linus命令精讲 linux的哲学思想 shell shell的定义 命令行格式 获得命令帮助 1 help 2 help 3 man 4 info 5 百度 目录操作 1 pwd print work directory 2 cd 3
  • Ubuntu18.04 防火墙设置- 详细

    ubuntu 系统默认已安装ufw 1 安装 sudo apt get install ufw 2 启用 sudo ufw enable sudo ufw default deny 运行以上两条命令后 开启了防火墙 并在系统启动时自动开启
  • document.write(unescape)的作用

    document write unescape 3Cscript src gaJsHost google analytics com ga js type text javascript 3E 3C script 3E document w
  • UE4像素流推

    今天看像素流推 遇到了一些问题 一开始是下载nodejs 开启 这个是没问题的 说下和文档不同的地方 开启的不是Start SignallingServer ps1 而是run local bat 那就需要先找到powershell 运行时
  • 经典vim插件功能说明、安装方法和使用方法介绍

    1 2 8 9 1 查看 key 相关信息说明的命令 help keycodes 10 11 12 2 ctags 13 1 帮助手册查看 14 help usr
  • 【已解决】Factory method ‘redisConnectionFactory‘ threw exception; nested exception is java.lang.

    Factory method redisConnectionFactory threw exception nested exception is java lang NoClassDefFoundError org apache comm
  • Axure RP9入门介绍----小白

    原型介绍 原型 prototype 这个词来自拉丁文的词proto 意谓 最初的 意义是形式或模型 在非技术类的文中 一个原型是给定种类的一个代表性例子 在这里我们主要讲的是软件原型 在软件开发中 一个原型是产品或数据系统的一个基本的实用模
  • 智能合约(二)————智能合约进阶

    1 保留关键字 abstract after alias apply auto case catch copyof default define final immutable implements in inline let macro
  • 交换机vlan的protocol状态为down

    1 交换机只配了vlan 却没有在任何一个端口下选择该vlan 2 该vlan没有配置ip地址 一般这种情况会导致交换机无法ping通该端口下的电脑 但网络是畅通的
  • 搭建Hyperledger Fabric环境 的详细步骤,超级详细

    本教程是跟着 某硅谷 三年前的视频一点点实现的 但是 跟着教程走 会出现很多视频里面没有出现过的问题 本文着重讲解搭建过程碰到的问题及解决方案 一 环境准备 先更新一下 sudo apt get update 1 安装docker 见我之前
  • 使用fromelf把axf文件转换成elf格式

    FROMELF用法 命令格式 fromelf options input file fromelf h即可打印出帮助信息 Product MDK Plus 5 29 Component ARM Compiler 5 06 update 6
  • 时序预测

    时序预测 Python实现CNN LSTM卷积长短期记忆神经网络时间序列预测 目录 时序预测 Python实现CNN LSTM卷积长短期记忆神经网络时间序列预测 基本介绍 程序设计 参考资料 基本介绍 时序预测 Python实现CNN LS
  • Visual Studio中使用GitHub

    Visual Studio中直接使用Github能够非常方便的同步 拉取git中的项目 还可以多人同时进行版本控制 小组合作的利器 也不需要拷贝代码了 具体使用方法 第一步 在Visual Studio中安装GitHub Extension
  • web系统数据字典加载处理,冷数据处理

    web系统加载数据字典或者类似于工程信息 项目信息这种 基本不会写的数据 在使用时虽然可以频繁读取数据库 但考虑到优化问题 还是希望通过缓存处理这种冷数据 数据库二级缓存机制会导致在写数据时 不能立即查询到已修改数据 在做类似与ERP这种表
  • mybatis-generator自动生成的类中含有XXXwithBLOBs,去掉的方法

    当数据库中的字段有text类型时 mybatis会为这种类型单独创建一个类来映射这两个字段 生成的主要po类中是没有这两个字段的 自动生成的xxxWithBLOBs类会继承生成的主要po类 public class ProductWithB
  • 束缚游戏 html,束缚游戏

    束缚 描述的是一个锁链束缚的眼镜男 在游戏中会遇到各种障碍 探索一个普通居家男人的心灵利用铁球来通过这些障碍的横向平台解谜游戏 游戏简介 束缚 是一款卷轴平台益智游戏 主角是一个被锁链束缚的眼镜男 他可以利用铁球通过各种障碍 游戏的宗旨是探
  • linux与freertos程序兼容,从freeRTOS运行应用程序

    FreeRTOS 以及大多数RTOS 不像通用操作系统 GPOS 那样工作 它们通常不是为了动态加载和执行任意用户提供的应用程序而设计的 在大多数情况下 您使用RTOS是因为您需要硬实时响应 并且执行第三方代码可能会对此造成影响 大多数RT
  • vivado AXI_interconnector ID信号的一些总结

    很久没有写东西了 最近尽力了很多生活上的事情 最终也算圆满结局 言归正传 主要是以AXI4为背景介绍4组ID信号 以及其计算方式 对照vivado PG059以及PG247 见解都是基于个人所学 会有偏差还望谅解 AXI4中去掉了WID 所
  • 基于iframe的HTTP长连接实现

    关于什么是http长连接我不废吐沫了 有专业的解释 http www ibm com developerworks cn web wa lo comet 你可以去看看我们介绍一下在struts下的实现首先写一个test jsp 写一些片段