前言

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

转载于:https://www.cnblogs.com/tonykan/p/3468407.html

分享一些Comet开发经验相关推荐

  1. 分享8年开发经验,浅谈java程序员职业规划

    在中国有很多人都认为IT行为是吃青春饭的,如果过了30岁就很难有机会再发展下去!其实现实并不是这样子的,在下从事.NET及JAVA方面的开发的也有8年的时间了,在这里在下想凭借自己的亲身经历,与大家一 ...

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

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

  3. 移动端 项目开发经验集锦

    移动端 项目开发经验集锦 本次要与大家分享的是,在项目开发过程中,移动端遇到的各种问题~本文主要与大家分享移动端开发经验,主要包括表单兼容(fixed定位的input存在的问题.iPhone.iPad ...

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

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

  5. QQ城市达人接口编程及经验分享

    说到QQ,估计中国大半的人都知道,也用过,QQ交友也迅速成为一种时尚,一种生活,乃至一种社会现象.扯远了,呵呵. 说到城市达人,估计很多QQ的用户都会知道,这是腾讯交友平台的一个举措,很多用户的信息都 ...

  6. Java RESTful Web Service实战(第2版)

    Java核心技术系列 Java RESTful Web Service实战 (第2版) 韩陆 著 图书在版编目(CIP)数据 Java RESTful Web Service实战 / 韩陆著. -2版 ...

  7. python数据分析基础 余本国_Python数据分析基础

    本书根据作者多年教学经验编写, 条理清楚, 内容深浅适中, 尽量让读者从实例出发, 结合课后练习, 少走弯路.本书涉及的内容主要包括Python数据类型与运算.流程控制及函数与类.Pandas库的数据 ...

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

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

  9. 2017年html5行业报告,云适配发布2017 HTML5开发者生态报告 期待更多行业标准

    近日,全球领先的企业级浏览器与HTML5 解决方案供应商云适配正式发布了<2017年HTML5开发者生态调查报告>(以下简称"报告").该报告主要针对HTML5前端开发 ...

  10. 【js】版本号对比处理方案

    一枚活跃于前端圈的90后码农 不定期分享互联网前端开发经验内容 微^信^公^众^号:Web前端Talk 陪你走在技术成长的路上,欢迎关注! 今天在处理一个bug问题,适配客户端版本:若版本号未达到,则 ...

最新文章

  1. 以安装PyTorch为例说明Anaconda在Windows/Linux上的使用
  2. 人脸识别“热”中的冷思考:道德伦理问题值得深思
  3. python opencv转换bytesio
  4. 如何将网站升级为HTTPS协议?
  5. android 观察者的框架,Android 架构师7 设计模式之观察者模式
  6. GDCM:gdcm::PhotometricInterpretation的测试程序
  7. 查询DBA_HIST_ACTIVE_SESS_HISTORY缓慢
  8. C# 正则表达式类 Match类和Group类
  9. ant-design-pro使用服务器数据接口代理配置
  10. 和电商有关的词语_关于电商的一些词
  11. 14种神笔记方法,只需选择1招,让你的学习和工作效率提高100倍!
  12. TI DSP C64X 优化基本方法
  13. 图形 3.6 纹理压缩——包体瘦身术——RGBA与ASTC与ETC2压缩与实际对比体验
  14. 自学python网站-python自学网站
  15. 单GPU每秒76帧,重叠对象也能完美分割,多模态Transformer用于视频分割效果惊艳...
  16. 嵌入式linux学习笔记--gitlab学习笔记-gitlab-runnner简单的使用介绍
  17. 去年净亏7.37亿美元,“自动驾驶第一股”的商业化之痛
  18. MatLab 画图方法
  19. 操作系统课程设计-二级文件系统,Windows平台版本,c语言
  20. SVD法坐标系转换原理

热门文章

  1. Mac外接2k显示器遇到的问题
  2. 软件开发有哪些规范和标准_车辆,机械专业如何从事汽车电子软件开发
  3. 安装虚拟机(二)配置静态ip
  4. mysql默认dba_DBA 基本常识 - 安装完 MySQL 后必须调整的 10 项配置 - iTeknical
  5. 5.2自动扫描及装配数据
  6. 【sklearn第十九讲】高斯混合模型
  7. pku2352 Stars(线段树实现)
  8. 为什么我们需要研究迁移学习?
  9. leetcode第一刷_Merge Intervals
  10. HDU 5857 - Median ( 查询模拟 + 思路 )