长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

优点:在无消息的情况下不会频繁的请求。

缺点:服务器hold连接会消耗资源。

    if not exists(select 1 from  sys.databases where name='beidoudemo')
begin
Create Database beidoudemo
end
go use beidoudemo
go
if exists(select 1 from sysobjects where name='AjaxPolling' and type='u')
begin
drop table AjaxPolling
end
go
Create table AjaxPolling
(
id int identity Primary key,
userName varchar(30) not null,
passwordKey varchar(50) not null
)

选用Jquery中的AJAX方法发送异步请求

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LongPolling.aspx.cs" Inherits="AjaxFinder.LongPolling" %>  

    <!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">
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<title></title>
<script type="text/javascript">
var userID = 0;
function SendXHR() {
$.ajax({
type: "post", //AJAX请求类型
url: "LongPollingServer.ashx", //请求url
cache: false, //无缓存
timeout: 1000 * 80, //AJAX请求超时时间为60秒
data: { time: 60, userID: userID }, //参数time时间为最多等待(后台保持)时间(60秒无论是否有数据立即返回),单位为秒。userID判断诗句是否为新数据的标识
success: function (data, textStatus) {
var obj = document.getElementById("NameDisplay");
//判断返回成功还是失败 如果后台保持连接的时间一到并且没有新数据就会返回fail开头失败的数据
if (data != null && data != "" && !(data.indexOf("fail") != -1)) {
var strarr = data.split(",");
// alert(strarr[0]);
userID = strarr[0];
obj.innerHTML = "亲!有新用户注册哦!用户名:" + strarr[1];
}
else {
obj.innerHTML = "亲!暂无新用户注册哦";
}
SendXHR();//请求后立即发起AJAX请求
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
//New Error do something
if (textStatus == "timeout") {
//超时间
SendXHR();
}
} });
}
window.onload = function () {
SendXHR();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
<div id="NameDisplay">
</div>
</form>
</body>
</html>

后台代码实现

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Net;
using System.Threading;
using System.Data; namespace AjaxFinder
{
/// <summary>
/// AJAX长轮询后台处理页面
/// 主要用于保持连接
/// 有数据返回,无数据继续保持连接超时返回 /// 请不要关注代码编写规范等一些问题。这仅仅是一个DEMO
/// 还存在诸多问题
/// </summary>
public class LongPollingServer : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
/*
context.Response.ContentType = "text/plain";
*/
int SendTime = ; //最多等待时间
int userID = ; //上一次的用户ID
if (context.Request.Form["time"] != null&&context.Request.Form["time"].ToString()!="")
{
SendTime =int.Parse(context.Request.Form["time"].ToString());//接收传来的的后台要保持时间
}
if (context.Request.Form["userID"] != null && context.Request.Form["userID"].ToString() != "")
{
userID = int.Parse(context.Request.Form["userID"].ToString());
}
int i = ;//计算超时时间(秒)
while (true)
{
Thread.Sleep();//停留一千毫秒(1秒)
i++;
if (i < SendTime)
{
if (NameStr(userID) != "")
{
context.Response.Write(NameStr(userID));
break;
}
}
if (i == SendTime)
{
context.Response.Write("fail:无数据");
break;
}
}
}
/// <summary>
/// 获得用户名
/// </summary>
/// <param name="userID"></param>
/// <returns></returns>
private string NameStr(int userID)
{
string result = string.Empty;
string Sqlstr = "select top 1 ID,UserName from AjaxPolling Order by ID desc";
DataSet ds = new DataSet();
ds = SQLHelper.Query(Sqlstr, null);
if (ds != null)
{
if (ds.Tables[].Rows.Count >= )
{
if (int.Parse(ds.Tables[].Rows[][].ToString()) != userID || ==int.Parse(ds.Tables[].Rows[][].ToString()))
{
result = ds.Tables[].Rows[][].ToString() + "," + ds.Tables[].Rows[][].ToString();
}
}
} return result;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}

Ajax 长轮询的更多相关文章

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

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

  2. Comet 反Ajax: jQuery与PHP实现Ajax长轮询

    原文地址(http://justcode.ikeepstudying.com/2016/08/comet-%E5%8F%8Dajax-%E5%9F%BA%E4%BA%8Ejquery%E4%B8%8E ...

  3. [转]网页实时聊天之js和jQuery实现ajax长轮询 PHP

    网页实时聊天之js和jQuery实现ajax长轮询 众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的 ...

  4. 用大白话揭开Ajax长轮询(long polling)的神秘面纱

    在看这篇Ajax长轮询之前可以先看看Ajax轮询技术(没有长),有助于理解: Ajax长轮询属于Ajax轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快. "不间断的通 ...

  5. php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室)

    php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室) 一.总结 1.ajax长轮询和websocket都可以时间网络聊天室 ...

  6. ajax长轮询 (转)

    javaWeb项目中需要一个实时提醒的功能,也就是某人做了某一操作,可以立即提醒到当前在线的用户 最开始想在用户做了操作后,储存一个状态到数据库中然后用每隔几秒用ajax去请求后台查询数据库来确定是否 ...

  7. 基于jquery,php实现AJAX长轮询(LongPoll),类似推送机制

    HTTP是无状态.单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应.若要实现聊天室.WEBQQ.在线客服.邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术(Comet)” ...

  8. Js和Jquery实现ajax长轮询

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

  9. Ajax长轮询(LongPoll)

    1)HTML HTTP是无状态.单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应.若要实现聊天室.WEBQQ.在线客服.邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术( ...

随机推荐

  1. TypeError: Buffer.alloc is not a function

    错误信息:TypeError: Buffer.alloc is not a function 截图如下: 解决办法(依次从上往下执行): sudo npm cache clean -f sudo np ...

  2. python推导式创建序列

    推导式创建序列 推导式是一个或多个迭代器快速创建序列的一种方式.可以将循环和条件判断结合,简化代码.几个推导式注意符号的使用,比如小括号,方括号,大括号等等. 列表推导式 列表推导式生成列表对象,语法 ...

  3. BZOJ 5306 [HAOI2018] 染色

    BZOJ 5306 [HAOI2018] 染色 首先,求出$N$个位置,出现次数恰好为$S$的颜色至少有$K$种. 方案数显然为$a_i=\frac{n!\times (m-i)^{m-i\times ...

  4. 如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)

    各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务(gts/fescar自动补偿的形式) 基于TCC实现的分布式事务 基于SAGA实现的分布式事 ...

  5. .NET开源项目 QuarkDoc 一款自带极简主义属性的文档管理系统

    有些话说在前头 因为公司产品业务重构且功能拆分组件化,往后会有很多的接口文档需要留存,所以急需一款文档管理系统.当时选型要求3点: 1.不能是云平台上的Saas服务,整个系统都要在自己公司部署维护(数 ...

  6. python全栈开发慕课网

    前端 web框架: flask:简单.轻量.灵活性大 (官网,stck overflowa); 目录结构:配置,发布,资源,日志,测试... 前后端协作:整体发布,前后端分离发布 django:简单, ...

  7. 简单QR分解之Gram-Schmit正交化&&Householder变换&&Givens Rotation变换&&计算步骤

  8. 【评分】Beta 答辩总结

    [评分]Beta 答辩总结 总结 按时交 - 有分 晚交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 倒扣本次作业分数 由于前期不够重视,到beta评分才发现有5组的代码提交仅由一人&qu ...

  9. json和ajax学习

    1.java对象和json字符串的转换 2.json对象list集合和json字符串转换 3.map对象和json转换

  10. springboot在yml中配置控制台sql打印方法小结

    方法一: logging: level: debug level.io.renren: debug path: logs/ file: admin.log   方法二 logging:    leve ...