http://www.cnblogs.com/hanxianlong/archive/2010/04/27/1722018.html

我潜水很多年,今天忽然出现。很久没写过博客了,不是因为不想写,而是因为没有什么感想,不知从何写起。

前天看到一篇博文《一步一步打造自己的WEBIM》,觉得COMET这个概念很有意思,但博主使用了自己的一套较为复杂的框架,看起来颇为费劲,故而我想通过简单的“jQuery+两个类”来实现一个简单的comet模型,并附上源码,请大家拍砖。

效果图如下:

一、概念

借用横刀天笑的解释这个Comet概念:“像彗星那样拖着长长的尾巴的http长连接”。事实上大家都知道,http是不可以与服务器持久连接的, 要是每个请求都与服务器持久连接的话,那服务器早就宕掉了,就像前段时间像博客园连接数超过2000就出来了Service Unavailable一样。。

就像网上的解释:

step 1.向服务器发出请求

step 2.服务器端查看是否有数据

step 3.如果有数据,则向客户端发送数据,结束该请求,返回Step1

step 4.如果没有数据,等待,直到有数据出现,进入step 3

通过以上几步可以看出,客户端与服务器是始终维持着一个连接的,这样看起来,就像客户端与服务器端始终有一个没有关闭的连接一样。也就是他们说的"HTTP长连接".

二、基于ASP.NET和jQuery的Comet实现

其实jQuery只是一个手段,这里用到它的Ajax部分,用于向服务器端发送请求。在我的源码中,就是用于负责向服务器端发送两个请求:1、发送数据  2、发送等待请求(当服务器有数据时该请求会返回后再次发送)

至于服务器端,如何实现判断服务器有数据便返回,没有数据便等待的功能呢?Google一下,可以知道ASP.NET实现异步处理的话,实现 IHttpAsyncHandler接口就可以了。该接口的BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)方法返回一个IAsyncResult对象。当不调用其参数cb的回调函数时,该请求不会结束。

故我们可以在该方法中做一下文章,用一个单例模式实现的消息处理类Messages将所有请求的IAsyncResult对象保存起来,这样便可以知道有多少个客户端发送了请求,同时也可以遍历所有的IAsyncResult对象,实现向其客户端主动发送数据的功能。

上面说了,jQuery会发送两个请求,第二个就是一个“等待请求”,当服务器端主动发送了数据到客户端时,该请求便能够收到服务器发送的数据。这样便完成了一次服务器向客户端主动发送数据。再次建立等待请求,重复循环,实现“长连接”。

三、源码

我本地没有画图工具,不能将以上流程用流程图很好表示出来,请海涵。代码也很简单,就是一个简单地不能再简单的实现,有兴趣的下载下来看看:

/Files/hanxianlong/Comet_by_ASP.NET.rar

允许转载,麻烦注明出处:http://www.cnblogs.com/hanxianlong

基于ASP.NET的comet简单实现的更多相关文章

  1. 基于ASP.NET的comet简单实现 http长连接,IAsyncResult

    http://www.cnblogs.com/hanxianlong/archive/2010/04/27/1722018.html 我潜水很多年,今天忽然出现.很久没写过博客了,不是因为不想写,而是 ...

  2. 基于 Asp.Net的 Comet 技术解析

    Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的说是一种基于现 ...

  3. 转:基于ASP.NET的Comet长连接技术解析

    原文来自于: Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的 ...

  4. 基于Asp.Net Core的简单社区项目源代码开源

    2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...

  5. cWeb开发框架,基于asp.net的cWeb应用开发平台介绍(一)

    cWeb开发框架是基于asp.net的B/S应用开发平台,采用三层架构理论,应用简单.代码简洁.运行快速. cWeb是bubufx提供,是分享资源,无任何版权限制,bubufx继续传承互联网精神,可随 ...

  6. 10分钟学会基于ASP.NET的 JQuery实例 (转)

    本文介绍如何在ASP.NET(ASP.NET/AJAX)里使用基于JQuery的AJAX技术.(源代码下载见最后) 在使用JQuery前,请到www.jquery.com下载最新版本的js代码,然后再 ...

  7. 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)

    1.0 为什么要做这个博客站? www.zynblog.com   在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个 ...

  8. WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效

    原文:WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效 本篇文章来源于几天前一个朋友向我咨询的问题.问题是这样的,他说他采用ASP.NET应用 ...

  9. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...

随机推荐

  1. UML建模文章总结

    一.为什么要学习UML UML是Unified Modeling Language(统一建模语言)的简称.UML是对软件密集型系统中的制品进行可视化.详述.构造和文档化的语言.制品{Artifact} ...

  2. poj 3614 Sunscreen

                                                                                                        ...

  3. 用phpmailer发邮件 中文乱码问题解决

    加入如下代码解决. $mail->CharSet = "GB2312"; //utf-8; $mail->Encoding = "base64"; ...

  4. FireFox不支持InnerText的解决方法

    innerText和InnerHTML是非常实用的一个属性,然而在FireFox中不支持此属性,可能是因为考虑到网页的安全性.这样一来为开发者带来了不少麻烦.FireFox中也提供了另外一个属性inn ...

  5. 手工添加Linux防火墙端口

    在linux实际操作中经常需要对防火墙进行修改,比如经常要修改或添加相关端口,下面以添加运行Tomcat所需8080端口为例: (以下命令操作均为root用户) 1.编辑iptables文件 # vi ...

  6. 支持异步通知的globalfifo平台设备驱动程序及其测试代码

    驱动: #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #incl ...

  7. Python本地化例子 - gettext 模块

    关键字:Python 3.4,gettext,本地化,Localization OS:Windows 7,Mac 1. 创建一个locsample.py文件,文件内容如下,把所有需要本地化的字符串放到 ...

  8. Android SDK离线安装方法详解(加速安装) 转

    AndroidSDK在国内下载一直很慢··有时候通宵都下不了一点点,最后只有选择离线安装,现在发出离线安装地址和方法,希望对大家有帮助! 离线安装包下载地址:http://dl.vmall.com/c ...

  9. 解决 ListView 水平滚动条不出现的问题(转载)

    问题的原因:http://www.cnblogs.com/nankezhishi/archive/2010/03/17/wpfbug13.html 解决方法:http://www.cnblogs.co ...

  10. 《WPF程序设计指南》读书笔记——第4章 按钮与其他控件

    1.Button类 using System; using System.Windows; using System.Windows.Media; using System.Windows.Input ...