天天看点

菜鸟观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