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异步回调的朋友来说看起来可能有点吃力,不过首先明白原理,然后再慢慢的去摸索技术。