前言

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

分享一些Comet开发经验的更多相关文章

  1. Swift - 发送消息(文本,图片,文件等)给微信好友或分享到朋友圈

    通过调用微信提供的API接口,我们可以很方便的在应用中发送消息给微信好友,或者分享到朋友圈.在微信开发平台(https://open.weixin.qq.com)里,提供了详细的说明文档和样例.但由于 ...

  2. jqGrid使用经验分享(一)——jqGrid简单使用、json格式和jsonReader介绍

    广大的读者朋友们大家好,很高兴又可以在博客中和大家分享我的开发经验了. 此次,我准备向大家介绍一个非常好用的jQuery表格插件——jqGrid. 如果您在实际项目中遇到web端表格展示功能的需求,又 ...

  3. 鸿蒙系统开源学习经验分享HarmonyOS[www.allharmonyos.com]

    分享鸿蒙系统开源知识,分享学习经验,分享鸿蒙系统开发经验 www.allharmonyos.com https://gitee.com/allharmonyos https://github.com/ ...

  4. Web开发人员必读的12个网站

    The more you actually create, the more you’ll learn.(创造的越多,学习的越多),世界上有无数个开发人员会在网上分享他们的开发经验,我们无法向所有人学 ...

  5. [译] 一、为何要推出AppCoda系列?

    声明:本文翻译自AppCoda网站的文章:Why Launching AppCoda?,作者是创建者Simon Ng.如有异议,请联系博主. 去年九月份,我在App Store上发布了自己第一个iPh ...

  6. 基于HTML5的SLG游戏开发(序)

          2012年前后,HTML5游戏凭借跨平台.易移植.部署简单.节省成本等优点被炒的火热,经过一两年的快速发展,市场出现了一些成功地HTML5游戏产品,像磊友的<修仙三国>,神奇时 ...

  7. 客户端是选择Java Swing还是C# Winform

      登录|注册     mentat的专栏       目录视图 摘要视图 订阅 [专家问答]韦玮:Python基础编程实战专题     [知识库]Swift资源大集合    [公告]博客新皮肤上线啦 ...

  8. iOS编程之前

    iOS编程之前 更新:帖子已经重新被更新过,以便能更好的兼容Xcode 5和iOS 7.       至今为止,已经超过6000位读者加入了这个iOS免费教程.首先,我要感谢这些加入我们社区的朋友.在 ...

  9. 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密

    上一篇我们介绍了缩短五倍的java bean,不知道你在看的时候有没有一种疑问捏? 本文同步自博主的私人博客wing的地方酒馆 再来回顾一下,两种代码的对比 public class User { p ...

随机推荐

  1. SSL简介

    注:本文基于互联网内容整合而成,非原创.参考文章参加[7.参考资料].引用时请附上原文地址. SSL(Secure Socket Layer,安全套接字层)是位于可靠的面向连接的网络层协议和应用层协议 ...

  2. Pipeline aborted due to error

    报错内容 x. Pipeline aborted due to error {:exception=>"LogStash::ConfigurationError", ... ...

  3. Java日期转换SimpleDateFormat格式大全(转)

    24小时制时间显示: public class Datetime { public static void main(String args[]){ java.util.Date current=ne ...

  4. minhash

    minhash是一种基于jaccard index 相似度的算法.属于LSH(Location Sensitive Hash)家族中的一员. jaccard index :有两个集合A={a , b ...

  5. B/S和C/S的区别

    B/S 指的是 Browser/Server : C/S 指的是Client/Server 区别: 1. B/S最大优势为客户端免维护,适用于用户群庞大,或客户需求经长发生变化的情况. C/S功能强大 ...

  6. C++调用python

    本文以实例code讲解 C++ 调用 python 的方法. 本文在util.h中实现三个函数: 1. init_log: 用google log(glog)初始化log 2. exe_command ...

  7. 神经网络:卷积神经网络CNN

    一.前言 这篇卷积神经网络是前面介绍的多层神经网络的进一步深入,它将深度学习的思想引入到了神经网络当中,通过卷积运算来由浅入深的提取图像的不同层次的特征,而利用神经网络的训练过程让整个网络自动调节卷积 ...

  8. c# 网络是否连接

    c#  网络是否连接 方案一: using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  9. MVC 3 基本操作增加修改

    在MVC中实现基本的增删改和传统的asp .net 程序有很大的不同,刚开始使用MVC还是有些不太适应,但是它的页面简洁也相当的不同,同时对服务器的访问性能上也有很大的提高.基于此,下面对我学习过程记 ...

  10. 在tomcat目录下启动tomcat,可以正常访问tomcat主页,然在在eclipse中集成了tomcat却访问不了tomcat主页,却能访问发布的项目

    tomcat server在eclipse中正常配置了,在eclipse建tomcat服务是在server 视图那里new server建立的,但把项目部署到tomcat后却发现tomcat主页报40 ...