上面有篇文章:异步请求分页示例:handler.ashx + $.ajax() + Json + 分页处理。今天要说的是跟上篇文章谈到的技术有一定关系的。本篇文章谈的Server-side Push技术,该技术其实早就问世了,国外、国内这方面技术文章也是有不少的;只是用在Web领域还是比较少而已。
其实这些个技术都是为了解决一个问题:就是服务端与客户端进行的异步数据通信问题。只是在特定的场合,特定的系统中;考虑到数据的实时性、响应的及时性、及提高性能和用户体验而采取的非常规的(发起请求-》响应请求)一个通信处理过程方式或方法。
一般的,Web客户端要想获取服务端的数据,都是通过一个请求,然后得到服务端的回应处理;这里的请求都是一个主动过程。客户端主动向客户端拉取数据。上一篇文章也是主动拉数据的技术方法。因为要具有一定的实时性;所以使用了setInterval 定时器操作。这种定时拉数据方法,其实数据的实时性规格是不高的。我们不可能2秒、1秒或者更短时间去服务器获取一次数据,这样虽然提高了数据实时性;但无疑会给服务器带来很大压力。如果系统大量多地方采取该方法显然不可取了。
针对上面问题,一些牛人们又想出了;服务器端推技术:顾名思义,就是服务端主动向客户端发送数据。当然这发送是需要满足一定条件的。具体要满足什么条件,这要看你的项目的业务逻辑的具体需要了。不然,服务器一直发送数据照样承受很大压力。
这些满足的条件就是数据库中业务数据有更新,或删除、新增。当然这些个操作在每个客户端都要有事件触发的。
先来讲一下今天这个示例思路:就是当每个客户端接到服务端以后,服务端都会把对应的连接保存在服务端一个列表容器中;并保持一个长连接;我们可以把它称为一个通道。这个通道就可以把数据发送到客户端的。当有多个这样通道以后;就说明有多个客户端在使用该数据。当一个客户端通过通道发送一个新增、修改、删除命令时;服务端获取这命令并操作。操作完,就可以通过已记录在服务端容器里的通道把数据实时分发到每个客户端。每个通道也是有生命周期的;就是获取到数据后,通道就断了;但客户端是递归调用的;断了以后会立即再建通道;就这样始终有一个长连接在哪里,保持数据有一个通道可立即使用。
该示例基本套用上篇文章一些代码及文件;只是数据通信处理上不一样。示例代码:可以点击这里可下载。包括一些牛客的示例一并放入了。CometDemo是笔者示例;其余是一些同仁的资料整理。说明一下笔者示例使用分页,出现了一些问题;但不妨碍给大家研究,提供思路。
上面这个思路还有一个情况不能满足:就是如果有些信息或者记录不是或者不适合没办法人为去更改;又没有对应某客户端事件触发。但到了某时某刻又必须更改显示的数据。比如说有这样一个列表:这个列表每行记录背景色会随着该条记录新增时设定的时间点而应该显示不同背景色。
至于怎么处理这样的数据行定时自更新显示情况,方法应该不止一种;就是怎样监听每条数据记录时间点,然后去修改显示结果。这里可以使用Sql Dependency,或者多线程等方式。这里可能要结合缓存去处理了。具体的,大家可以一起再深入研究了。
相关文章
Server-push技术(comet)----------asp.net中的异步处理+client与服务器端的长连接
Server-push技术(comet)----------asp.net中的异步处理+client与服务器端的长连接 (续)
Kevin Chen
2012-04-24 于苏州-太仓