项目在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