利用Ajax实现长连接(模拟推送,半长连接)

 非常多程序都能够通过socket来实现长连接,实现消息的即时推送。但因为http请求一般都是短连接,一次请求结束,就会断开与server的连接。server不能主动推送数据到client,而仅仅能由client发起请求,但有些时候。须要在web上实现即时的消息传输,比方即时聊天、股票动态信息等。


    在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,效果非常帅。

posted on 2017-05-02 10:13  wgwyanfs  阅读(271)  评论(0编辑  收藏  举报

导航