<%@ Page Language="C#" AutoEventWireup="true" CodeFile="JqueryAjaxLongPoll.aspx.cs" Inherits="JqueryAjaxLongPoll" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
    <script type="text/javascript" src="script/jquery-1.2.6.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $("#Button1").bind("click",{btn:$("#Button1")},function(evdata){
                $.ajax({
                    type:"POST",
                    url:"JqueryAjaxLongPoll.aspx",
                    dataType:"json",
                    timeout:10000,
                    data:{ajax:"1",time:"10000"},
                    success:function(data,textStatus){
                            //alert("ok!");
                            evdata.data.btn.click();
                    },
                    complete:function(XMLHttpRequest,textStatus){
                            if(XMLHttpRequest.readyState=="4"){
                                alert(XMLHttpRequest.responseText);
                            }
                    },
                    error: function(XMLHttpRequest,textStatus,errorThrown){
                            //$("#ajaxMessage").text($(this).text()+" out!")
                            alert("error:"+textStatus);
                            if(textStatus=="timeout")
                                evdata.data.btn.click();
                    }
                });
            });

/*$("#ajaxMessage").ajaxStart(function(){
                $(this).text("准备建立请求.readyState0:");
            });
            $("#ajaxMessage").ajaxSend(function(evt, request, settings){
                $(this).text("开始请求,准备发送数据.readyState1:"+request.readyState);
            });
            $("#ajaxMessage").ajaxComplete(function(event,request, settings){
                if(request.status==200)
                    $(this).text("请求完成.readyState4:"+request.readyState);
            });
            $("#ajaxMessage").ajaxStop(function(){
                $(this).text("请求结束.");
            });*/
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="Button1" type="button" value="AjaxLongPoll" />
        <label id="ajaxMessage"></label>
    </div>
    </form>
</body>
</html>

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;

public partial class JqueryAjaxLongPoll : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Form["ajax"] == "1")
        {
            //Response.End();
            int time = Convert.ToInt32(Request.Form["time"]);
            DateTime date1 = DateTime.Now.AddMilliseconds((double)time);
            bool ready = false;
            while (Response.IsClientConnected)
            {
                Thread.Sleep(3000);
                if (DateTime.Compare(date1, DateTime.Now) < 0)
                {
                    Response.End();
                    break;
                }
                //ready = true;
                if (ready)
                {
                    Response.Write("SetValue('" + DateTime.Now.ToString() + "')");
                    //Response.Flush();
                    Response.End();
                    break;
                }
                else
                {

}
            }
        }
        else
        {
            if (!Page.IsPostBack)
            {

}
        }
    }
}

思路:

利用jquery,很方便的就能实现ajax,上面设置了ajax的timeout时间,由于设置了timeout将会造成不能保持长连接,到了时间ajax自动会报“超时”的错误,也就是会调用error方法,此时textStatus=="timeout",timeout后重新进行ajax请求。服务器接受ajax请求的时候,会接收一个超时时间的值,超时的情况下服务器端的处理也立即停止。当客户端成功获取返回结果时,也会立即进行新的ajax请求,如此循环。

为什么要设置客户端的ajax超时值呢?因为服务器为了保持请求(阻塞请求),必须有一个无限循环,循环的结束条件就是获取到了返回结果,如果客户端关闭了(客户端浏览器的关闭不会发消息给服务器),服务器无法知道客户端已经关了,这个请求没必要处理下去了。最终会造成资源过度浪费,只要用一个折中的办法,限制超时时间。

可以不必设置客户端ajax的超时时间,但进行请求的时候传递一个超时值给服务器,服务器在处理的时候,如果超时时间到了的话,还没有客户端需要的结果,这时传递一个超时信息给客户端,客户端接收到了此信息,根据情况重新进行ajax请求。XMLHttpRequest没有超时的参数,Jquery用window.setTimeout自己封装的(到了定时时间运行超时处理方法,和XMLHttpRequest结束方法)。可以根据这个思路来改变一下,IBM上介绍的LONG POLL好像也是这样的。

$(document).ready(function(){
            $("#Button1").bind("click",{btn:$("#Button1")},function(evdata){
                $.ajax({
                    type:"POST",
                    url:"JqueryAjaxLongPoll.aspx",
                    dataType:"json",
                    data:{ajax:"1",time:"6000000"},
                    success:function(data,textStatus){
                            //成功
                            if(data.success=="1"){
                                //客户端处理
                                //...
                                ///重新请求
                                evdata.data.btn.click();
                            }
                            //超时
                            if(data.success=="0"){
                                evdata.data.btn.click();
                            }
                    },
                    complete:function(XMLHttpRequest,textStatus){
                            if(XMLHttpRequest.readyState=="4"){
                                alert(XMLHttpRequest.responseText);
                            }
                    },
                    error: function(XMLHttpRequest,textStatus,errorThrown){
                            //$("#ajaxMessage").text($(this).text()+" out!")
//                            alert("error:"+textStatus);
//                            if(textStatus=="timeout")
                                evdata.data.btn.click();
                    }
                });
            });

后台代码变更后:
if (Request.Form["ajax"] == "1")
        {
            int time = Convert.ToInt32(Request.Form["time"]);
            DateTime date1 = DateTime.Now.AddMilliseconds((double)time);
            bool ready = false;
            while (Response.IsClientConnected)
            {
                Thread.Sleep(3000);
                if (DateTime.Compare(date1, DateTime.Now) < 0)
                {
                    Response.Write("{success:'0'}");
                    Response.End();
                    break;
                }
                //此处进行请求处理,有结果了置ready = true
                //ready = true;
                if (ready)
                {
                    Response.Write("{success:'1'}");
                    Response.End();
                    break;
                }
            }
        }
        else
        {
            if (!Page.IsPostBack)
            {

}
        }

上面的方法应该就可以满足要求了,具体的超时时间可以根据情况来设置。这也是我根据IBM上介绍的“server push”思路,来实现了其中的一种,也不知道有没有问题,还请大家多多赐教。

利用Jquery实现http长连接(LongPoll) {转}的更多相关文章

  1. 利用Jquery实现http长连接(LongPoll)

    参考:http://www.cnblogs.com/vagerent/archive/2010/02/05/1664450.html PS:为了满足 某些需要 实时请求的业务(PS:例如聊天室),我们 ...

  2. PHP持续保有长连接,利用flush持续更新浏览器UI,下载进度条实现

    如何用PHP+JS实现上传进度条,大部分的人可能都实现过,但是下载呢?如何呢?原理也是差不多的,就是分次读写,每次读多少字节,但是这样的不好就是长连接,一般实现下载进度条常用的两种解决方案是:一种是需 ...

  3. 利用node.js来实现长连接/聊天(通讯实例)

    首先: 需要在服务器端安装node.js,然后安装express,socket.io这两个模块,并配置好相关的环境变量等. 其次: 服务端代码如下: var app = require('expres ...

  4. comet基于HTTP长连接技术(java即时通信,推送技术详解)

    服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接. comet基 ...

  5. 转:基于ASP.NET的Comet长连接技术解析

    原文来自于: Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的 ...

  6. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  7. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  8. 网页实时聊天之js和jQuery实现ajax长轮询

    众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

  9. Comet:基于 HTTP 长连接的“服务器推”技术解析

    原文链接:http://www.cnblogs.com/deepleo/p/Comet.html 一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示 ...

随机推荐

  1. Windows 上如何安装Sqlite(转载)

    1.获得命令行程序 SQLite命令行程序(CLP)是开始使用SQLite的最好选择,按照如下步骤获取CLP: 1).打开浏览器进入SQLite主页,   www.sqlite.org. 2).单击页 ...

  2. html中调用silverlight中的方法

    在xaml页面中放置一个textblock控件来绑定数据 <ItemsControl   x:Name="cityname">            <Items ...

  3. 多路转接之poll和select

    先看poll(): #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  4. Golang与MySQL

    1. 在golib下载go-sql-driver/mysql go get github.com/go-sql-driver/mysql 2. 代码引入 import ( "database ...

  5. 整理了一下 jQuery 的原型关系图,理解起来更加方便一些。

    图例:黄色的为对象,蓝色的为函数.

  6. trap命令使用

    分享一个shell脚本技巧,大家写shell脚本的时候,一般而言仅仅保证功能可用,但程序的鲁棒性却不是太好,不够健壮,多数是脚本处理 一些中断信号导致,应对非预期的系统信号,其实系统自带的trap命令 ...

  7. mini2440 linuxi2c驱动

    #include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #inclu ...

  8. COS中访问文件的三种方式

    1.通过FID来访问文件(比如EF,DF) 2.通过SFI来访问文件(有些COS命令可以通过SFI来快速访问文件,而不需要事先选中文件) 3.通过文件名来访问文件(只能是DF文件)

  9. zookeeper数据迁移

    在不停机的情况下,实现集群之间数据迁移代码: private void create(ZooKeeper zk1, ZooKeeper zk2, String path) throws Excepti ...

  10. ##常用效果css##

    1    绝对定位的元素的位置相对于最近的已定位祖先元素,如果元素没有已定位的祖先元素,那么它的位置相对于最初的包含块.元素被设置成,absolute,原有的位置会被占用,设为 relative原位置 ...