comet(http 请求长连接) 之 ajax 长查询 简单实现。

这几天看到几篇关于http 长连接的文章,之前做过一个简单WebIM 采用ajax定时查询,效率一般,请求一多 iis 日志每天大概有80M左右。在线人数在40人左右(基本和挂QQ一样)。

今天特意研究了一下http 的长连接。有了一点点成果。现放出来大家一起讨论一下。

不清楚长连接请点这里。

1.客户端请求

<script type="text/javascript"> 

var HttpRequest;

function CreateXmlHttpRequest()
{
if(window.XMLHttpRequest)
{
HttpRequest=new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
HttpRequest=new ActiveXObject("MICROST.XMLHTTP");
}
}

function Send()
{
document.getElementById("test").innerHTML="等待返回信息";
CreateXmlHttpRequest();
if(HttpRequest!=null)
{
HttpRequest.onreadystatechange=ShowMessage;
HttpRequest.open("GET","Handler.ashx?name="+escape("leon")+"&m"+Math.random());
HttpRequest.send();
}
}

function ShowMessage()
{
if(HttpRequest.readyState==4&&HttpRequest.status==200)
{
if(HttpRequest.responseText.length>0)
{
alert(HttpRequest.responseText);//收到信息
//如果有信息返回 重新发送请求 递归
Send();
}
}
}

</script>


2.服务的如何hold请求
public class Handler : IHttpHandler
{
private bool ok = true;

public void ProcessRequest(HttpContext context)
{
ok = true;
while (ok)//超时设置ok为false即可
{
//循环检查是否有信息存在
Check();

//防止循环太频繁
System.Threading.Thread.Sleep(1000);
}
}

private void Check()
{
List<message> list = new List<message>();//信息列表

string str = "";
lock (im.mlist)
{
if (im.mlist.Count > 0)
{
foreach (message m in im.mlist)
{
if (m.username == HttpContext.Current.Request["name"].ToString())
{
list.Add(m);
str = m.messagecontent;
break;
}
}

if (list.Count > 0)
{
foreach (message m in list)
{
im.mlist.Remove(m);
}
}

//收到信息 循环结束
ok = false;

if (list.Count > 0)
{
//推信息
HttpContext.Current.Response.Write("收到信息:" + str);
}
}
}
}

public bool IsReusable
{
get
{
return false;
}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值