网页聊天的实现?

两仪
  • 9.6k

要实现和web版本的qq功能差不多的模块,宏观上,有那些技术解决方案,请在兼容性、性能、高并发方面各抒起见。

我先抛砖引玉下:

(1) 基于ajax技术的实现。

ajax(异步JavaScript和XML,Asynchronous javascript and xml),它的作用就是可以实现页面与服务器端的无刷新交互。用ajax来实现web聊天室的基本原理是:在页面上每隔一段时间就通过ajax从服务器中获取数据,然后更新页面显示。这种方法简单明了,缺点是实时性不高。

(2) 基于Comet技术的实现。

Comet 是一种新的 Web 应用架构。基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求。Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求较高的应用,如股票交易行情分析、聊天室和 Web 版在线游戏等。

Pushlet是一种comet实现(Pushlet 是开源的Comet 框架):在Servlet机制下,数据从服务器的Java对象直接推送(push)到客户端的页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式不同。

Pushlet基于HTTP流,这种技术常常用在多媒体视频、通讯应用中,比如QuickTime。与装载HTTP页面之后马上关闭HTTP连接的做法相反,Pushlet采用HTTP流方式将新数据源源不断地推送到client,再此期间HTTP连接一直保持打开。有关如何在Java中实现这种Keep-alive的长连接请参看Sun提供的《HTTP Persistent Connection》和W3C的《HTTP1.1规范》。

(3)基于XMPP协议的实现

XMPP(可扩展消息处理现场协议)是基于XML的协议,是专为及时通信系统设计的通信协议,用于即时消息以及在线现场探测。它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。著名的开源聊天系统服务器Openfire就是基于XMPP协议的Jabber服务器。

可以通过Flash或ajax与Jabber服务器进行交互,实现webIM的功能,

(4)基于flash的XmlSocket的实现

Flash Media Server是一个很强大的流媒体服务器,它基于rtmp协议,提供了强壮的流媒体交互功能。在FMS中,提供一种远程共享对象(SharedObject)的机制,客户端可以创建并连接到服务器端的远程共享对象。可以有很多个客户端连接到同一个远程共享对象中,任何一个客户端对共享对象进行了修改,服务器都会将共享对象的修改信息发送给所有其他连接到这个共享对象的客户端。这种远程共享对象的机制可以很方面地实现以下功能:· 远程控制幻灯片放映 · 文字聊天 · 网络对战 · 远程选择和播放歌曲 · 现场拍卖 · 客户服务应用程序。

远程共享对象很适合用于实现web聊天室中的群聊功能。为每一个群都建立一个远程共享对象,这样的话,任何用户在群上发信息,就可以通过服务器自动发送到所有的群成员。

用远程共享对象来实现单聊是不实际的。对应单聊的实现,我们需要借助socket。客户端通过socket服务器与其他客户端进行私聊。聊天信息通过socket服务器进行转发。

这种方式是效率最高的web聊天室实现方式。

补充连接:http://hi.baidu.com/yanyanerxiao/item/864f6635e5e57ab4124b140c
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

回复
阅读 16k
4 个回答
✓ 已被采纳

网页上的实时交互为什么会有多种模型,就是因为各个方案之间互有优劣,否则早就统一了。

效率最高的是WebSocket,flash xmlsocket只是兼容实现,但是你也要考虑到有些电脑没有flash,怎么办?

而AJAX分两种,主动轮询和long-polling,主动轮询是最差的realtime实现,长轮询一般就归类到comet的方案里去了,在这些方案里,长轮询是相对兼容性最好的。

而引用里描述的pushlet,差不多就是Streaming吧,HTML5已经把这个传输模型API化了,但这个实现要求页面始终保持一个不被关闭的http连接,会对服务器造成额外的压力。

现在还种多页面通讯方案:sharedworker,这个我暂时还没实现过,不好评价,API本身也还在推广阶段,依稀记得IE就没实现这个接口。

如果这个模块性能要求不是那么高,只是要提供功能的话,简单来说node+socket.io就非常够了,客户端和服务端的实现都不会太难。但你如果追求性能以及后期的节点维护,甚至"并发"的话,那就前端AJAX/WebSocket 优雅降级,然后后端直接基于XMPP上Erlang,异步、多核、分布、集群,erlang是天生的通讯栈,而且于此同时你也可以根据XMPP协议拓展出多个平台的客户端的实现,并且容易集成到各个业务线里去。

我推荐socket.io,文档很全面,通过给出的例子就可以实现一个简单的聊天了。

宣传栏