长轮询:客户端向服务器发送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. svn解决冲突问题

    1.在linux的branchs下创建了一个新的分支branch_2后,commit.提示: 2.这是把/my_branch/index.html删除后svn update也不能解决问题 3.到myb ...

  2. Docker安装MySQL并配置远程访问

    1.docker search mysql 查看mysql版本 2.docker pull mysql 要选择starts最高的那个name 进行下载 3.docker images 查看下载好的镜像 ...

  3. 深入理解Redis的持久化

    RDB RDB是将当前数据生成快照保存到硬盘上. RDB的工作流程: 1. 执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接 ...

  4. HAAR与DLib的实时人脸检测之实现与对比

    人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等. 对于opencv的人脸检测方法,优点是简单,快速:存在的问题是人脸检测效果不好.正面/垂直/光线较好的人脸, ...

  5. 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟

    朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟 [下载本文PDF进行阅读] 这里所说的六兄弟只指ELK套件(ElasticSearch+Logstash+Kibana)以及TIG套件(Tele ...

  6. Flask序列化

    我们在做后台接口的时候,对于返回值,用的最多的就是json数据格式 flask中,返回json数据格式,我们可以用到flask的jsonify函数. 对于基础序列是可以直接序列化的,但是更多的情况下, ...

  7. win8.1系统下安装ubuntu实现双系统实践教程

    寒假闲来无事,一程序猿哥们给发了一个linux的shell编程指南,看了几张感觉不错.于是装一个试试. 没想到一装才知道了那么的问题. 下面开始: step 1: 软件准备:Ubuntu 系统镜像,这 ...

  8. 如何在Github中删除已有仓库或文件

    一.删除已有仓库如果我们想要删除Github中没有用的仓库,应该如何去做呢? 进入到我们需要删除的仓库里面,找到“settings”即仓库设置: 然后,在仓库设置里拉到最底部,找到“Danger Zo ...

  9. Day15 Python基础之logging模块(十三)

    参考源:http://www.cnblogs.com/yuanchenqi/articles/5732581.html logging模块 (****重点***) 一 (简单应用) import lo ...

  10. Effective java ---遵守普遍接受的命名规则

    alibaba的java命名规范如下: . [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $Object / name_ ...