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本质非常的简单的,根本没有什么神秘。如果各位能够有时间多想想,也能够提出影响潮流的技术。

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/tonykan/p/3468407.html
Copyright © 2011-2022 走看看