zoukankan      html  css  js  c++  java
  • 分享一些Comet开发经验

    前言

    本comet技术主要用于数据库持久层的 穿越防火墙 远程访问。只要有一台中继网站,任意地点的数据库都能被访问。

    Comet概念介绍

    WebIM、网页的客服、meebo等大家听说过了。最近还有个兄弟开源了个网页客服叫,PowerTalk。各位可以搜索一下。

    这些最新最炫的技术,用了一个叫comet的架构。

    comet对于我来说= http长连接

    这个是一个通俗的解释。

    老外最擅长就就是发明概念,生怕别人忘了自己的存在。因此把一个很简单的东西搞了一个摸不着边的名词:Comet。

     

    Comet思想怎么来

    先抛开comet,给个案例分析:

    局域网(防火墙内)的客户端要与外界联系,如何做到?必然想到了客户端主动发出申请,穿越防火墙。否则外界无法获得客户端地址(什么xxx映射、路由的就先不谈了)。

    什么技术能穿越防火墙?必然是Http协议了,因为80号端口是不会封的。(ftp、smtp、pop之类的再闪开,别找我岔)

    外界的信息如何传递到客户端?必然外界把信息放在一个公共地方(寄存中心),客户端主动链接去取这个信息。这样实现了互通了。

    但是,客户端什么时候知道外界放了信息呢?传统的思想,就是客户端轮询寄存中心。可是挑剔的技术人员们怎么能够忍受这种简直是侮辱智商的方案呢?于是,Comet出来了。

    Comet技术牛逼的地方,在于

    1. 当客户端发出了链接申请

    2. 寄存中心先把这个申请存在哈希表

    3. 寄存中心寻找有没有属于这个申请的回复信息(byte[])

    4. 如果发现了有对应的回复信息,那么交给申请输出(response.write(byte[])),然后返回这个申请

    5. 如果在一段时间内(60sec)仍然没有人发消息给这个申请,那么返回这个申请,至于返回什么自己定义吧,比如(response.write("sorry, timeout. please reconnected."))

    6. 客户端继续发出一个新的申请,回到2了。

    comet的关键就是在客户端发出的请求被服务器先持久了。如果用代码说话,可以看:


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web;

    namespace Pixysoft.Framework.Noebe.Comets.Core
    {
        
    class CometSyncHandler : IHttpHandler
        {
            
    #region IHttpHandler 成员

            
    public bool IsReusable
            {
                
    get
                {
                    
    return true;
                }
            }

            
    public void ProcessRequest(HttpContext context)
            {
                
    //这个就是我在系统里对context进行持久 里面我放了个while(true){} 当然也设置了一个超时出口

                CometSyncRequestManager.Instance.Process(context);
            }

            
    #endregion
        }
    }

    ASP.NET 下的COMET实现

    不同的技术,对comet可以有不同的实现,那么在.net下,就要找到最适合的。

    CodeProject上有2篇超级棒的入门文章,我建议先玩第二篇的例子,然后看第一篇的思想。

    Scalable COMET Combined with ASP.NET

    Scalable COMET Combined with ASP.NET - Part 2

    第二篇只是实现了一个webim,怎么实现每个人有每个人的想法,不必屈泥与具体的实现方式。我就最简单的介绍一下这个超棒的comet思路。

    1. 寄存中心就是CometAsyncHandler (文中使用异步asp.net实现IHttpAsyncHandler ),异步的asp.net资料在:

    http://msdn.microsoft.com/zh-cn/magazine/cc164128(en-us).aspx

    2. 客户端的申请就是HttpContext。他先包装成CometAsyncResult, 然后再封装成CometWaitRequest

    3. 哈希表就是CometThreadPool,存放着各种CometWaitThread,这些CometWaitThread一对一对应了CometWaitRequest.

    4. 如何知道某个申请的需要交给谁?可以自定义一些协议在请求里面,例如Bayeux protocol

    就这么简单。

    基于ASP.NET COMET的WEB IM关键技术

    上文的技术不足以实现一个WEB IM,那么还需要掌握

    1. ASP.NET的客户端回调技术

    http://www.cnblogs.com/mywebname/articles/1060383.html

    链接javascipt和asp.net的桥梁

    2. AJAX

    能够实现客户端无刷新浏览器,向服务器发出申请,只要发出的申请有回复,立刻再发出新的申请,不需要轮训之类的,就是一个死循环。

    3. JSON

    能够被javascipt解析,因此能够被ajax使用。所以与服务器通讯的信息要使用json格式。

    4. 传输协议Bayeux protocol (或自己定义一些简单协议)

    因为客户端发送的信息要被服务器路由到对应的链接,因此这个信息除了用户在WEB IM输入的内容,还要包括一部分路由信息等。

    后续

    COMET本质非常的简单的,根本没有什么神秘。如果各位能够有时间多想想,也能够提出影响潮流的技术。

  • 相关阅读:
    python pickle模块
    python struct模块
    python threading模块
    python queue模块
    python3 requests模块 基本操作
    python json模块
    C语言回调函数
    工厂方法模式
    git fetch, git pull 以及 FETCH_HEAD
    git删除远程文件夹或文件的方法
  • 原文地址:https://www.cnblogs.com/tonykan/p/3468407.html
Copyright © 2011-2022 走看看