Web下(不考虑使用activex控件的那种)即时寻呼一般都是基于“拉”技术,即每隔一段时间向服务器获取最新消息,然后反映到客户端,基于“拉”技术,一般有几种形式:
frame/iframe刷新:一般是用一个隐藏的iframe/frame页面,定时刷新,从服务器获取最新消息,并执行脚本,将消息反映到客户端。
这种方法的好处是兼容性好,适用于所有支持frame和脚本的浏览器,缺点就是因为是网页直接刷新,有可能在某些机子上每次刷新都会有“吧嗒”的声音,如果浏览器状态栏可见,上面的进度条会一闪一闪的,比较烦人。例如微软最新推出的MsnWebMessenger即是基于此技术。
XmlHttp/XmlDom无刷新:这种无刷新技术一度让Web开发者亢奋不已。在客户端,XmlDom可以根据URL获取服务器端的Xml文件并返回为一个XmlDocument,而XmlHttp不仅可以获取xml和html,还可以向服务器端发送一个XmlDocument,而且,结合客户端脚本的定时器:setTimeout("Function()",TimeoutInterval),定时从服务器获取数据。
尤其要注意一点是不管是XmlDom还是XmlHttp,都有“同步”和“异步”之说,如果是“同步”,则浏览器会等到把所获取的Xml全部下载完才继续执行,如果是“异步”,则浏览器会不管它有没有下载完,直接继续下一步执行。对于Web即时寻呼,还是推荐使用“异步”方式,因为“同步”方式很可能会造成浏览器“假死”的情况,对客户来说很不友好。使用“异步”就可以避免这个问题,然后可以在onreadystatechange事件中判断是否已经加载完,然后解析消息。
这种方式的好处是对于客户来说感觉不到浏览器在刷新,缺点是必须要客户端是IE,并且安装了msxml,所以兼容性不是很好。
BTW:听说Asp.Net2.0对于这种无刷新进行了封装,可惜没试过,不知道兼容性如何:)
脚本调用WebService无刷新:WebService是个好东西,js也可以调用webserice,微软专门有一个WebService.htc,将对WebService的调用进行了封装,可以非常方便的调用,其实即使没有WebService.htc,我们也可以自己来解析,因为WebService实质也就是xml了,在客户端可以结合XmlDom来解析。然后借助定时器,也可以做到无刷新来获取服务器端消息。
这种方式的优缺点和第二种方式差不多。国外有个聊天室就是使用的这种技术。