菜鸟观comet+jquery完成简单webim项目调试过程!

项目在web.config中 写了一个htpphander<add path="comet_broadcast.asyn" type="AsnyHandler" verb="POST,GET"/>

在jquery的doucment中写了一个方法:

$(document).ready(function () {

function send() {

//向comet_broadcast.asyn发送请求,消息体为文本框content中的内容,请求接收类为AsnyHandler

$.post("comet_broadcast.asyn", { content: $("#content").val() });

//清空内容

$("#content").val("");

}

这样jquery访问的comet_broadcast.asyn 就可以访问类:AsnyHandler.
第二:AsnyHandler类实现的接口是:IHttpAsyncHandler,这个接口的实现是可以让asp.net程序异步调用.怎样实现让一个连接始终在服务器上和客户端保持呢?
该接口的BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)方法返回一个IAsyncResult对象。当不调用其参数cb的回调函数时,该请求不会结束。程序先进入BeginProcessRequest()方法;
BeginProcessRequest方法详解:
BeginProcessRequest 方法return IAsyncResult对象 这个对象是 IAsyncResult 接口由包含可异步操作的方法的类实现。它是启动异步操作的方法的返回类型实现对象:myAsynResult -> myAsynResult asyncResult = new myAsynResult(context, cb, extraData);
在myAsynResult 中有异步处理的方法.[当然myAsynResult类一定是现实了接口:IAsyncResult]
String content = context.Request.Params["content"] 接收来自jquery中的参数:Content
String content = context.Request.Params["content"];//在第一次运行对象的时候content=-1 //这里是标示没有信息 在等待信息的状态.
下一步:将信息添加到Message中.
//向Message类中添加该消息
Messages.Instance().AddMessage(content, asyncResult);
Instance方法详解:
private static readonly Messages _Instance = new Messages();
//上面为什么是静态的,只读的呢?
这是c#种一种简洁的单例模式的实现方式. 这样就保证了用_Instance类对象时都只是一个对象在使用.
public static Messages Instance()
{
return _Instance;
}
//上面的方法是把Message对象给调用方法.
AddMessage方法详解:
//当加载这个页面的时候调用当然是if中的方法.
public void AddMessage(string content,myAsynResult asyncResult)
{
//当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
//此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,
//该连接将会被遍历,并且会将该连接输出内容后,结束该连接
if (content=="-1")
{
clients.Add(asyncResult);
}
else
{
//将当前请求的内容输出到客户端
asyncResult.Content = content;
//等等将介绍Send方法
asyncResult.Send(null);
//否则将遍历所有已缓存的client,并将当前内容输出到客户端
foreach (myAsynResult result in clients)
{
//Content对象是myAsynResult 对象申明的string对象 目的是放广播的内容.
result.Content = content;
result.Send(null);
}
//清空所有缓存
clients.Clear();//广播以后将List对象清空
}
}
这样第一次运行就完成了.
当在广播中输入文字点击发送的时:
步骤照旧 通过了web.confing 到了AsnyHandler类中,执行BeginProcessRequest方法.实例化类对象:myAsynResult
通过jquery将要广播的内容接收到string content对象中来.
上面的和第一次运行是一样的直到到了AddMessage方法
进入else中的send方法详解:
public void Send(object data)
{
context.Response.Write(this.Content);
if (cb!=null)
{
cb(this);
}
_IsCompleted = true; ;
}
send方法其实很简单:就是将得到的content对象通过jquery的方式将输入的信息return到jquery中去在jquery中操作.content内容
cb(this) 这个方法实际上就是将这次请求做一个结束.
这样就将一次完整的请求完成了.为什么会在跳到myAsynResult类中呢?
看看jquery中有执行了wait()方法 这样循环的将客户端和服务器连接了.这样就实现了comet
我是菜鸟 这是我调试 项目时的过程. 源码在: http://www.xueit.com/html/2010-04/21-9091245422010427225758312.html
如果认为我写的有问题请我和联系,忘斧正.QQ312931671

你可能感兴趣的:(jquery)