利用Jquery实现http长连接(LongPoll) {转}
<%@ 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) {转}的更多相关文章
- 利用Jquery实现http长连接(LongPoll)
参考:http://www.cnblogs.com/vagerent/archive/2010/02/05/1664450.html PS:为了满足 某些需要 实时请求的业务(PS:例如聊天室),我们 ...
- PHP持续保有长连接,利用flush持续更新浏览器UI,下载进度条实现
如何用PHP+JS实现上传进度条,大部分的人可能都实现过,但是下载呢?如何呢?原理也是差不多的,就是分次读写,每次读多少字节,但是这样的不好就是长连接,一般实现下载进度条常用的两种解决方案是:一种是需 ...
- 利用node.js来实现长连接/聊天(通讯实例)
首先: 需要在服务器端安装node.js,然后安装express,socket.io这两个模块,并配置好相关的环境变量等. 其次: 服务端代码如下: var app = require('expres ...
- comet基于HTTP长连接技术(java即时通信,推送技术详解)
服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接. comet基 ...
- 转:基于ASP.NET的Comet长连接技术解析
原文来自于: Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的 ...
- 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 ...
- HTTP的长连接和短连接——Node上的测试
本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket. 关键字:长连接.短连 ...
- 网页实时聊天之js和jQuery实现ajax长轮询
众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...
- Comet:基于 HTTP 长连接的“服务器推”技术解析
原文链接:http://www.cnblogs.com/deepleo/p/Comet.html 一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示 ...
随机推荐
- 委托、匿名函数与Lambda表达式初步
(以下内容主要来自<C#本质论第三版>第十二章委托和Lambda表达式) 一.委托续 上上周五看了看委托,初步明白了其是个什么,如何定义并调用.上周五准备看Lambda表达式,结果发现C# ...
- PAT乙级真题1001. 害死人不偿命的(3n+1)猜想 (15)(解题)
卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...
- Helloworld模块之内核makefile详解
Hello World 模块以及对应的内核makefile详解 hello.c: #include <linux/module.h> //所有模块都需要的头文件 #include < ...
- Jquer的三种初始化方式
$(document).ready(function(){ alert(200); }); jQuery(function($){ alert(100); }); $(function(){ aler ...
- hdu 1872 稳定排序
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1872 稳定排序 Description 大家都知道,快速排序是不稳定的排序方法.如果对于数组中出现的任 ...
- 使用Apriori算法和FP-growth算法进行关联分析
系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...
- hive hwi使用
hwi(hive web interface)是hive命令行接口的补充. 使用方法: 1.配置: 在配置文件hive-site.xml 中,默认有hwi的配置 <property> &l ...
- 为什么要用Message Queue
摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral 为什么要用Message Queue 解 ...
- [转]ldconfig几个需要注意的地方
[转]ldconfig几个需要注意的地方 http://www.cnblogs.com/arci/archive/2011/03/19/1988952.html 1. 往/lib和/usr/lib里面 ...
- VIM实用基本操作技巧
文本编辑器有很多,图形模式下有gedit.kwrite等编辑器,文本模式下的编辑器有vi.vim(vi的增强版本)和nano.vi和vim是Linux系统中最常用的编辑器.有人曾这样的说过在世界上有三 ...