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.在线客服.邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术( ...
随机推荐
- P1365 WJMZBMR打osu! / Easy-洛谷luogu
传送门 题目背景 原 维护队列 参见P1903 题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有nn次点击要做,成功了就是o,失败 ...
- MVC架构在Asp.net中的应用和实现
转载自:http://www.cnblogs.com/baiye7223725/archive/2007/06/07/775390.aspx 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能 ...
- 环境部署(一):Linux下安装JDK
自动化测试的主要目的是为了执行回归测试.当然,为了模拟真实的用户操作,一般都是在UAT或者生产环境进行回归测试. 为了尽量避免内网和外网解析对测试结果的影响,将自动化测试服务部署在外网的服务器是比较好 ...
- Scripts may close only the windows that were opened by it
关闭当前窗体报以下js错误: Scripts may close only the windows that were opened by it (脚本只能关闭由它打开的窗口) 使用场景,在js中关闭 ...
- npm太慢, 淘宝npm镜像使用方法
淘宝 npm 地址: http://npm.taobao.org/ 如何使用 有很多方法来配置npm的registry地址,下面根据不同情境列出几种比较常用的方法.以淘宝npm镜像举例: 1.临时使用 ...
- git中Please enter a commit message to explain why this merge is necessary.
Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pul ...
- 网络拓扑自动发掘之三层设备惯用的SNMP OID的含义
原文地址:https://blog.csdn.net/maty_wang/article/details/81305070 1. ipNetToMediaIfIndex Name/OID: ipNet ...
- 常用yum操作命令
1.yum repolist 获取当前系统有效的repolist,如下图 2.yum list,列出所有可安装的软件包 获取当前有效repolist中所能安装的所有rpm包列表,(很长,慎重),可以结 ...
- H5 54-清空默认边距
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- H5 25-CSS三大特性之层叠性
25-CSS三大特性之层叠性 我是段落 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...