利用Ajax实现长连接(模拟推送,半长连接)
在Ajax技术被发掘曾经。在网页上实现无刷新的即时聊天,似乎是非常困难的事情。但因为Ajax技术的兴起,人们能够进一步来挖掘它的潜力了,象gmail、google gtalk的网页版。都是Ajax长连接的重要应用。眼下非常多站点可能都已经在使用长连接技术了。比方SNS站点的即时聊天。
1.Ajax短连接方式实现网页聊天
自己画了一个模型图:
常规的短连接模式下。都是通过不间断刷新请求实现的,比方每间隔3秒发送一次Ajax请求。3秒更新一下数据,然后就这样不间断刷新下去,直到用户关闭网页。
这样所带来的弊端就是。假设用户非常长时间都没有操作。每次刷新都不会返回新数据,这样就造成了资源的浪费。非常多请求都是不是必需的。另外一个问题,就是用户的输入,跟数据的请求不是同步的,会造成一定的信息延迟。
2.Ajax长连接方式实现网页聊天
模型图:
Ajax长连接模式。它的刷新是依据数据来运行的,假设有新数据返回,接收并解析显示数据,然后发起新的Ajax请求,假设一段时间内,用户没有操作,则连接处于睡眠状态,一直等待实用户输入或者请求超时。然后发起下个Ajax请求。
这样做的优点是。每一个消息都会即时推送到client。延迟极少。另外每次请求都是有意义的。与短连接对照。效率要高非常多。但对于一个用户量非常多。而且操作非常频繁的站点,长连接模式也会出现过于频繁的刷新问题。眼下IE对于HTTP连接数是有限制的,每一个网页仅仅能同一时候进行两个长连接,第三个长连接会被堵塞。
利用php在后台sleep,自己做了个模拟的程序。查看效果
看了一下别人写的Ajax长连接聊天的案例。以php为例,基本上是在后台进行不间断的检測,假设有新数据就推送。假设没有新数据,就一直堵塞,直到30秒超时,然后client又一次发起下一个请求。后台推断里重要的一行代码:usleep(10000); 就是暂停10毫秒,缓解一下CPU压力,个人感觉假设暂停100毫秒,时间延迟也是非常难感觉到的。这样的方法基本就是把前端的循环,搬到了后台。中间降低了网络传输的环节。假设是一个Ajax的即时聊天系统,要保存用户的聊天记录。那就须要跟数据库相结合。每秒10次以上的数据查询。这个与短连接比,必然加大了数据库的压力,详细怎么优化。这个应该是交给server端人员来处理了。
假设想要了解很多其它的内容请Google一下comet。或者看看这里(一个非常不错的框架,Ajax Push Engine)。这个站点有非常多demo,效果非常帅。