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

来源:互联网 发布:手机网络延迟 编辑:程序博客网 时间:2024/04/28 02:00

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