Server-push技术(comet)----------asp.net中的异步处理+client与服务器端的长连接

  server-push技术已经面世很久了,但直到GTALK的诞生才慢慢的引导出这项技术,不过到现在为止,也很少有人去应用这方面的技术,server-push倒底是一个什么样的东西呢?

  故名思义,server-push即“服务器推”的意思,ajax大家都用过,它和server-push是完全相反的两个东西,ajax是从服务器端拉取数据,如果要定期更新页面上显示的数据块,那么最简单的方法就是写个计时器,server-push则不同,它的本质是将client与server建立一个长连接,即连上后不断开,一旦服务器端有新的数据就将其推送到客户端,讲到这里出现了几个问题。

  1.ajax与server-push的区别与相同点分别是什么?

  答:ajax与server-push的共同点是,它们同样使用javascript实现数据无刷新展示,区别在于,如果你使用ajax时时更新数据,那么无论服务器端数据有无变化,都会定期向服务器端取数据,这样便造成了一些不必要性能消耗,对服务器造成了一定的压力,而server-push则不同,它是在服务器端有新数据产生的时候才对客户端进行数据反馈,不过其缺点也产生于此,因为它会占用WEB服务器的连接数,用户访问量大且对连接数有一定限制的WEB服务器是不适用于server-push的。

  2.服务器端如何发现有新数据?

  答:这个问题需要根据具体应用环境来看,如果用于“即时通讯”工具的在线用户统计,服务器端发现有新用户登录,即向所有客户端推送数据,还有一种用得比较多的方式是在服务器端使用多线程来监控数据的更改。

  3.服务器端如何往客户端推数据?

  答:此问题是最关键的,服务器端怎么推送数据到客户端呢?.net中有个异步回调,使用它便可以实现服务器端往客户端数据的推送,.net中异步回调是怎么回事呢?其实很简单.

  e.g. 写个类,假如专门用来实现异步回调,必须注意以下几点

  1>继承IHttpAsyncHandler接口   //定义 HTTP 异步处理程序对象必须实现的协定。

  2>以下几个方法不能少

//启动对 HTTP 处理程序的异步调用。 public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) {} //进程结束时提供异步处理 End 方法。 public void EndProcessRequest(IAsyncResult result){} //
获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。 (继承自 IHttpHandler。) public bool IsReusable{get { return false; ; }} //通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。 (继承自 IHttpHandler。) public void ProcessRequest(HttpContext context){throw new NotImplementedException();} //
重点在这里,这里负责向客户端写数据 try {   context.Response.Write(this.value); if (m_Callback != null) {   m_Callback(this);//此处执行完毕,客户端ajax的请求便可获取到服务器端推送的数据了 } } catch { } finally {   m_IsCompleted = true; }

上面方法中的this指的是另外一个类,此类继承接口IAsyncResult(//表示异步操作的状态)

  终上所述,server-push需要客户端与服务器端建立一个长连接,这个长连接不能断,这样服务器端一旦有东西就会通过这个管道传到客户端,数据的push又需要使用到.net的异步回调。此处没有涉及到具体的代码编写,对于没有接触过.net异步回调的朋友来说看起来可能有点吃力,不过首先明白原理,然后再慢慢的去摸索技术。

时间: 2024-08-31 17:40:29

Server-push技术(comet)----------asp.net中的异步处理+client与服务器端的长连接的相关文章

关于.NET中的Server push技术

今天突发奇想,想研究一下服务端内容有变化,如何引起客户端的改变. 一般来说方法有2种,一种就是客户端用JS异步定时轮询服务器端,这种是大部分人采用的方法,但是 我在想到底可以不可以实现服务器端有改变时才会主动推送到客户端呢?按理来说这种方式对于B/S是不 可能实现的,因为B/S是无连接的,这种request/response的方式无法保持状态.搜了一下,看到博客园 有位朋友写了篇文章是关于Server Push的,文章点这里看,我自己把它的代码复制过来看了下效果,完 整代码如下: 前台: 1 <

一起谈.NET技术,ASP.NET中如何正确使用Session

Asp.Net中的Session要比Asp中的Session灵活和强大很多,同时也复杂很多:看到有一些Asp.Net开发人员报怨说Session不稳定,莫名其妙的丢失,其实这正是Asp.Net改进的地方之一. 我们知道Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的. 在传统web编程语言(比如asp)中,session的过期完全是按照TimeOut来老老实实处理

一起谈.NET技术,ASP.NET 中JSON 的序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中

一起谈.NET技术,ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies

从ASP.NET 3.5升级至ASP.NET4之后,遇到三种登录后不能保存cookie的情况(升级前一切正常): 1. 遨游3在极速模式下(默认模式). 2. FireFox中修改了UserAgent. 3. 诺基亚手机自带浏览器或者UCWeb浏览器访问博客园手机版(m.cnblogs.com). 今天终于把罪魁祸首给揪出来了,它就是Request.Browser.Cookies. 如果你在程序中使用Form验证并使用cookie保存用户的登录状态,请切记:在<authentication mo

一起谈.NET技术,ASP.NET中的认证与授权

用户认证 .net提供了3种用户认证的方式,分别是Windows,Forms,Passport.这几种形式的定义可以在网站根目录下Web.config中的authentication节点中看见.Windows是默认的验证形式,它是根据机器的访问权限来判断的.Passport是微软提供的一种验证形式,不常用.我们需要的知道并了解的是forms形式.forms验证就是表单认证,提供了以身份id和密码的形式进行验证和授权管理的功能. 在正式使用forms验证之前我们先看看它运行的一个流程: 从上图我们

Asp.Net中的脚本回调和Server.Transfer页面传值

asp.net|server|脚本|页面 在Asp.Net中经常要用到脚本回调和页面间的传值,下面是关于ScriptCallBack和Server.Transfer简单的示例代码 WebForm1.aspx给Head中增加__doPostBack脚本,如果页面含有HyperLink等按钮控件,该脚本和2个隐藏控件"__EVENTTARGET"和"__EVENTARGUMENT"由FrameWork自动生成,若没有需要手动添加 <SCRIPT language=

必知技巧:ASP.NET中常用的优化性能方法详解

asp.net|技巧|详解|性能|优化 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后

ASP.NET中常用的优化性能方法

asp.net|性能|优化 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后只有在真正需

充分发挥异步在 ASP.NET 中的强大优势

作者:Brij Bhushan Mishra 最近几年,异步编程受到极大关注,主要是出于两个关键原因:首先,它有助于提供更好的用户体验,因为不会阻塞 UI 线程,避免了处理结束前出现 UI 界面挂起.其次,它有助于大幅扩展系统,而且无需添加额外硬件. 但是,编写合适的异步代码来管理线程本身是项乏味的工作.虽然如此,其巨大好处让许多新旧技术纷纷开始使用异步编程.微软自发布了 .NET 4.0以后也对其投入颇多,随后在 .NET 4.5中引入了 async 和 await 关键字,使异步编程变得前所