随着web技术的发展和硬件的革新,web应用已逐渐在侵占着C/S软件的领域。不得不说,B/S模式的应用将是未来的主流,当然这只是本人的一家之言.当用户在浏览器中能做的事情越来越多的时候,当用户慢慢习惯只用浏览器来获得一切需求的时候,到那时他们会发现原来他们的电脑只需要一个浏览器,仅此而已。这就是chromebook的发展理念吧。当然这个时候什么时候能到来却是个未知数。当然很明显我扯远了。
今天要说说的是关于在浏览器中即时通讯的问题.到现在你会发现web即时通讯应用到处都能见到。很多网站都有即时通讯的应用。首先介绍几个比较知名的web IM应用:webqq,网页fetion,开心网,白社会等等。
一个web即时通讯应用主要要克服两个问题:
1.信息的持久化
2.信息的传递。
第一个问题很简单,选择也挺多,比如你可以选择数据库,文件,临时的缓存等来保持聊天信息。具体依据你的项目需求来做决定。本文主要是要说说这第二个问题-信息的传递。
web通信方式对服务器来说也主要有两种方式:推和拉。
所谓”推”即服务器收到了数据传递请求时主动向对方客户端推送的方式。这也是一种理想的方式,但却是一直很难实现的技术难题。
“拉”即是客户端采用轮询的方式来不断对服务器进行http请求,这是现在广泛使用的方式。
web即时通讯的信息传递一直以来有个问题那就是:如何保证当有信息需要传递的时候即时的传递给对方?也许你会觉得这不是个问题,当时当你知道了http是个无状态无连接的协议时,你会发现这是个很大的问题。让我们先看看针对这个问题才采用的解决方案的发展历程。
阶段一:指定页面全部或局部的刷新时间间隔
最初为了更新客户端的数据信息采用的方式是通过<meta>内指定自动刷新的时间间隔,这样浏览器会在该时间到时自动刷新该页面。这是最初的解决更新客户端信息的方式,也是最原始也是最蹩脚的方式。现在一些手机网页上还有采用这种方式,我记得以前用手机看nba文字直播的时候就是这种方式。这种用户体验让人发指,缺点显而易见。当然还有一种实现原理一样的局部刷新方式,就是内嵌隐藏的iframe来不断刷新。早期很多就是采用的这种方式。
阶段二:Ajax的轮询
Ajax技术的诞生,给我们带来了很大的惊喜。就是由于ajax技术使得我们可以采用异步的方式对服务器发起请求,这对用户体验绝对是一个相当大的改善。ajax轮询就是结合js的setInterval函数指定时间间隔发起http请求。但是这种方式的缺点也是很明显的,这个时间间隔你觉得取多少合适呢?
阶段三:Ajax长轮询-Comet
Comet技术的出现还是受到了很大的关注。比较这一问题至始至终都没有得到一个好的解决方案。首先先介绍介绍这个Comet。Comet 是一种新的 Web 应用架构。基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求。Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用,如股票交易行情分析、聊天室和 Web 版在线游戏等。它的主要不同之处就在于它会客户端保持一种长连接状态,直到消息被传递后才释放。其实到这里这才是真正的算得上实时通讯了。我去网上查了下这个技术一般都是和Java使用。Tomcat6已支持了Comet技术。然后我本想找找PHP和Comet结合的例子,得到的尽是无情的鄙视。Comet实现长连接有两种方式:
1.HTTP 流(HTTP Streaming)这种情况下,客户端打开一个单一的与服务器端的 HTTP 持久连接。服务器通过此连接把数据发送过来,客户端增量的处理它们。
2.HTTP 长轮询(HTTP Long Polling)这种情况下,由客户端向服务器端发出请求并打开一个连接。这个连接只有在收到服务器端的数据之后才会关闭。服务器端发送完数据之后,就立即关闭连接。客户端则马上再打开一个新的连接,等待下一次的据。
这种方式实现通讯方式相比已经有很大提高,至少能对得起实时通信这个称号。现在很多实时通讯应用就是基于此技术。如webqq。当然它的缺点就是要维持这个长连接明显加大了服务器的负担。
接下来或许是HTML5 WebSocket…
WebSocket是HTML5一种新的协议。它是实现了浏览器与服务器的双向通讯。在 WebSocket API 中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。这种方式不仅简单,而且降低了服务器的要求。只是至少要等到你的用户使用的浏览器支持它了再说。
其他插件式的通信方式
其实在上述发展的过程中,还有一种通讯方式存在,那就是使用activeX控件或者JAVA Applet等实现Socket通信。还有使用的较为广泛的flash。其实这种通信方式是最划算的。但是不足的是原生浏览器并不支持,需要用户安装相关的浏览器插件才行。于是我便可以不多说了。谁爱装插件谁装去(flash除外,没办法)。
好了,这里只是简单的说下web通讯方面的一些技术,如果你要想研究透其中的某一项都得花些时间专研才行。