Ajax 长轮询
长轮询:客户端向服务器发送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 长轮询的更多相关文章
- 网页实时聊天之js和jQuery实现ajax长轮询
众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...
- Comet 反Ajax: jQuery与PHP实现Ajax长轮询
原文地址(http://justcode.ikeepstudying.com/2016/08/comet-%E5%8F%8Dajax-%E5%9F%BA%E4%BA%8Ejquery%E4%B8%8E ...
- [转]网页实时聊天之js和jQuery实现ajax长轮询 PHP
网页实时聊天之js和jQuery实现ajax长轮询 众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的 ...
- 用大白话揭开Ajax长轮询(long polling)的神秘面纱
在看这篇Ajax长轮询之前可以先看看Ajax轮询技术(没有长),有助于理解: Ajax长轮询属于Ajax轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快. "不间断的通 ...
- php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室)
php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室) 一.总结 1.ajax长轮询和websocket都可以时间网络聊天室 ...
- ajax长轮询 (转)
javaWeb项目中需要一个实时提醒的功能,也就是某人做了某一操作,可以立即提醒到当前在线的用户 最开始想在用户做了操作后,储存一个状态到数据库中然后用每隔几秒用ajax去请求后台查询数据库来确定是否 ...
- 基于jquery,php实现AJAX长轮询(LongPoll),类似推送机制
HTTP是无状态.单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应.若要实现聊天室.WEBQQ.在线客服.邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术(Comet)” ...
- Js和Jquery实现ajax长轮询
众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...
- Ajax长轮询(LongPoll)
1)HTML HTTP是无状态.单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应.若要实现聊天室.WEBQQ.在线客服.邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术( ...
随机推荐
- Luogu2295 MICE
Lougu2295 MICE 给一个 \(n\times m\) 的矩阵 \(a\) ,求一条从 \((1,\ 1)\) 到 \((n,\ m)\) 的最短路径,使得与路径相接的所有网格的权值和最小 ...
- Luogu4983 忘情
Luogu4983 忘情 定义序列 \(x_1,\ x_2,\ \cdots,\ x_n\) 的值为 \(\frac{((\displaystyle\sum_{k=1}^nx_k\times \bar ...
- matlab中fix函数,floor函数,ceil函数
1)fix(n)的意义是取小于n的整数(是向零点舍入的意思是往零的方向上靠),这是一类应用在整数取值上的函数,就如同以前我们所研究的求整问题,例如,fix(pi)=3;fix(3.5)=3;fix(- ...
- 学号 20175329 2018-2019-3《Java程序设计》第四周学习总结
学号 20175329 2018-2019-3<Java程序设计>第四周学习总结 教材学习内容总结 第五章 上周学习的第四章是体现了数据的封装,本章第五章主要是体现出对象的另外两个方面的重 ...
- CentOS下安装Apache
CentOS下安装Apache,首先在用户状态下使用su root命令切换到超级管理员界面,让后开启终端,进行apache的安装过程. [root@localhost centos]# yum ins ...
- face recognition[MobileFaceNet]
本文来自<MobileFaceNets: Efficient CNNs for Accurate Real-Time Face Verification on Mobile Devices> ...
- 开发手记:JedisConnectionException: Could not get a resource from the pool
对于Redis,生产环境是集群模式,测试环境是单例模式,如果在生产环境中用单例模式会报错. 解决办法,通过云配置,将配置进行自动化配置. 另附一份Redis配置: #***************** ...
- 【转】MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- Rollup处理并打包JS文件项目实例
关于Rollup rollup是一款用来es6模块打包代码的构建工具(支持css和js打包).当我们使用ES6模块编写应用或者库时,它可以打包成一个单独文件提供浏览器和Node.js来使用. 它的优点 ...
- 官宣 ! 52abp_Pro版本低调上线
上线了 官宣!官宣!官宣! 重要的事情说三次. 是的,你没有看错 https://www.52abp.com/ 的官方企业模板:52abp-pro已经正式上线. 至此52abp.com的官方网站就算告 ...