WebIM通信实现

关于Web-based IM通信模式的思考

摘要:

本文从Instant Messaging 出发,讨论了Web_based IM信息通信的特殊性,并在此基础上详细分析了现有的实现方案及其各自优缺点。

引言:

Instant Messaging(读成I-M),是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,现主要用于网络即时聊天软件和特殊设备的网络实时监控。该技术普遍采用C/S架构,基于TCP/UDP协议,通过服务器协作,利用防火墙穿透(代理)或基于UDPNAT穿透技术,保持客户端之间的持续长连接,实现客户端之间信息的实时交互。但是,该类模式下的软件系统要求下载安装专用的客户端程序,导致系统部署成本高昂,系统维护困难。同时,为保证即时通信的顺利完成,一般还要求客户端防火墙开放特定端口,引起系统安全问题。因此,这种模式的IM技术在网络环境下的广泛使用还存在一些局限性。

Web-based IM,是基于HTTP协议,系统采用B/S模式,客户端通过访问特定的网页而实现的及时通信技术。这种即时通信技术以网页为载体,避免下载安装庞大的客户端程序,系统功能在服务器端统一维护,既减少了系统部署费用,也降低了维护难度。因此,Web-based IM技术将在基于Web的远程监控、网站客服等方面有重大的意义。

然而,Web-based IM在技术实现上存在难以逾越的困难:首先,Web-based IM采用HTTP作为主要的通信协议,因此,HTTP的非连接、无状态特性将导致通信状态管理非常困难;其次,HTTP访问的单向性只允许客户端(Web浏览器)主动去联系服务器,而服务端却无法主动联系特定的客户端,更不用谈多个客户端之间的互访。所以,要实现Web环境下的实时通信,必须首先要解决这个问题,即充分利用HTTP的特性,在技术实现上做出适当的调整,以适应即时通信的需要。本文将在前人的基础上,从客户端“拉”和服务器“推”的角度,总结归纳基于Web的即时通信方案,并进一步分析比较各自的优劣点。

Web IM通信实现方式

1.     客户端“拉”(Client_pull)模式

传统的HTTP请求模式为:客户端主动向服务器发送信息更新请求,服务器响应请求,客户端接收完响应之后显示更新信息,这也称为客户端“拉”。为实现客户端信息(准)实时更新,一般采用客户端轮询的方案,即实时信息通过网络发送到服务器,保存到服务器内存甚至服务器实时数据库中,客户端根据实际情况,每隔一定时间就自动向服务器重新请求页面数据,以保证客户端内容的实时性。然而,传统的做法是客户端页面整体刷新,导致大量无用信息的重复下载,不但浪费客户端、服务器以及网络资源,而且这种同步的请求方式还将致使客户端页面长时间处于等待响应阶段,而无法继续操作,严重影响客户端体验效果。因此,随着 AJAX技术的成熟,人们常使用XMLHttpRequest对象,采用异步方式访问服务器定时获取更新信息。

2.       服务器“推”(Server-push)模式

服务器“推”模式,即服务器在信息变化之后主动发送新的信息到客户端,客户端接收之后自动进行更新。但是,由于HTTP无状态的特性,服务器响应完毕客户端请求之后,二者之间的通信在默认情况下会自动断开,加上NAT、客户端防火墙等因素的影响,服务器随时向客户端发送更新信息的条件还很不成熟,除非二者之间保持实时的连接。要实现客户端与服务器的实时连接,目前存在以下两种方案值得考虑。

1)基于客户端套接字的服务器推技术

要实现客户端与服务器的实时连接,传统的方式是采用在客户端页面中嵌入ActiveXFlashApplet之类的插件,插件基于TCP/UDP协议,通过套接字方式,实现客户端与服务器的持久连接,保证二者信道的持续通畅,以达到服务器在获取新信息之后可以主动发送到客户端,进行更新。一般而言,在不考虑通信信息的完整性的情况下,为减轻服务器的负载,服务器可以基于UDP协议向客户端发送更新信息。由于UDP是一种不可靠的协议,所以如果需要考虑通信信息的一致性等,则必须使用具有信息完整性验证的TCP协议进行通信。

2)Comet技术

近年来,由于Ajax技术的发展和推广,一种基于HTTP长连接、无需在浏览器端下载安装插件服务器“推”技术,即Comet技术,成为新宠。其实现模型有以下两种:基于 AJAX 的长轮询(long-polling)方式和基于 Iframe htmlfile 的流(streaming)方式。

长轮询的基本思想就是服务器不立即响应客户端请求,直到服务器接收到针对该客户端的新的信息的时候才响应客户端的请求。客户端一收到服务器的响应就马上发送下一个请求,这样就保证了客户端总是处于请求等待响应的状态,从而使得服务器处于“主动”的地位,当其有数据要发送时可以准确无误地找到客户端,这就类似于一个持久的TCP连接,如图所示

 

 

如果在双方规定的时间内,在两个方向上都没有反应(如客户端没有需要更新的信息,而连接即将超时的情况),则服务器可以用一个没有数据的空响应来进行响应。这个响应将立即触发一个新的客户端请求,这样就可以保证在网络连接不正常的情况下双方都可以在一个合理的时间内知道。为了避免传统HTTP请求导致页面整体刷新的情况,客户端请求一般采用AJAX技术,利用XMLHttpRequest对象向服务器发送异步请求以更新数据。

流(streaming)方式的基本思想是: HTML 页面里嵌入一个隐蔵帧,然后将这个隐藏帧的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。然而,iframe服务器端并不返回直接显示在页面的数据,而是返回对客户端 Javascript 函数的调用,如“<script type="text/javascript">js_func(“data from server ”)</script>”。服务器端将返回的数据作为客户端 JavaScript 函数的参数传递;客户端浏览器的 Javascript 引擎在收到服务器返回的 JavaScript 调用时就会去执行代码。

 

从上图可以看到,每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接,服务器端可以设置一个超时时间,超时后通知客户端重新建立连接,并关闭原来的连接)。

实现方式比较

采用纯粹的HTTP+AJAX技术实现网页的实时通信,技术简单,成本低,但是存在一些不足:第一,所有客户端的更新消息通过服务器进行“被动”地中转,客户端通过对服务器进行轮询,实现客户与客户之间的消息交互,因此客户端获取的信息是“伪实时”的。第二,轮询的时间间隔的设定异常困难:如果时间间隔过短,就会产生大量的无用请求,加重网络的负担;如果时间间隔过长,又不能保证客户端及时获取更新信息。由此可见,该方案的成功实现必须解决低响应等待时间和低网络带宽之间的矛盾问题。倘若服务器仅在数据发生变化之后,才向客户端发送更新信息,那么这一切问题都能得到妥善处理。

Comet技术可以解决低响应等待时间和低网络带宽之间的矛盾问题,并且在信息实时性方面有所改善,但是仍然存在一些问题需要注意:首先,该模式会仍然导致部分无用信息的下载;其次,对于某些对信息实时性要求很高的应用,它也表现出心有余而力不足;再者,基于HTTP1.1规范,同一客户端不能同时使用超过2个的HTTP长连接;最后,由于Web 服务器会为每个连接创建一个线程,如果在大型的商业应用中使用 Comet,服务器端需要维护大量并发的长连接,因此在这种应用背景下,服务器端需要考虑负载均衡和集群技术,或是在服务器端为长连接作一些改进。

基于插件的解决方案利用Socket连接服务器的确可以保证客户端信息的实时更新,但一些因素值得考虑:首先,部分页面插件需要客户端下载安装(如ActiveX),因此在特定客户端环境下可能因为插件安装失败而导致实时通信无法使用;其次,页面插件使用套接字接口,需要服务器开放一个通信端口,在实现过程中甚至可能需要程序员解决防火墙穿透问题;再次,页面插件在接收到服务器返回的信息之后,可能无法通过脚本语言(如JavaScript)去更新HTML页面(如Applet);最后,客户端连接数量增多会加重网络负担和服务器负载,直接影响客户端并发访问数量。

展望:

以上几种解决方案虽然都存在一定的不足,但在特定的情况下却具有一定的优势。因此,在实际的工作中,可以针对特定网络状况、服务器性能、信息有效期限等现实情况从有效信息率(单位时间系统内产生的有效信息的数量)、客户端并发数量、数据一致性、信息实时性、服务器负载等方面考察各种方案。

 

参考文献:

1.       Comet:基于 HTTP 长连接的服务器推技术

2.       B_S模式下基于JabberIM系统的构建方法

3.       IM:聊天进化谱

4.       基于Ajax的即时消息系统的设计与实现

5.       基于P2P技术实现即时通信系统的研究

6.       基于Web的远程实时监控系统研究及应用

7.       即时通信研究综述

8.       即时消息

9.       网页即时通信的研究及应用

10.   Ajax技术在基于Web的实时监控系统中的应用研究

11.   Ajax技术在实时WEB监测中的应用研究

12.   Flash在基于Web的远程实时监控系统中的应用研究

13.   动态Web技术在实时监测系统中的实现

14.   基于B_S的海洋平台远程监控系统设计

15.   基于Web的告警实时显示系统的设计与实现

16.   基于Web的工业信息实时监控系统研究

17.   基于WEB的工业远程监控系统研究与实现

18.   基于Web的实时控制系统的研究与设计

19.   基于服务器推送和事件流处理技术的实时Web系统研究

20.   Anil Bhatt 张凯峰(译)Ajax推送与拉取方式的比较

21.   JerryQu WebIM开发之通讯模式介绍

22.   赵宏华  基于WEBIM实现考虑

23.   及时通讯原理

24.   WebIM开发之多页面数据同步

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
WebIM说明 WebIM是一款基于jQuery的一款web即时通讯插件,姑且这么称呼吧。插件最大程度实现IM的常用功能,除即时通讯的常用功能外,还加入了:消息盒子、窗口抖动、添加删除好友、最近联系人、超时登录界面、网站小秘书、聊天记录、发送频率限制、发送产品、发送名片、发送表情、产品分享、黑名单、举报、收藏、公告、智能网址过滤、消息提醒、修改资料、名片二维码、禁止粘贴、收起联系人列表、推荐好友等30余项改进。全浏览器兼容。 插件调用简单方便,只需在现有的web系统中加入几行代码,理论上可嵌入任何web系统。 2012年项目,已不再维护。 配置 $(function() { $(document).FnWebIM({ autoLogin :true, //boolean型,默认是否自动登录,true:自动登录,false:手动登录,默认为true msgRefreshTime :1000, //number型,消息刷新时间,单位为ms friendRefreshTime :10000, //number型,好友刷新时间,单位为ms showSecretary :true, //boolean型,默认是否显示小秘书,true:显示,false:不显示,默认为true noticeContent :"唐僧师徒历经千辛万苦,终于见到了佛祖……", //string型,公告内容 为空时不显示公告 sendPicture :true, //boolean型,是否允许发送图片,true:允许,false:不允许,默认为true msgMaxSize :300, //number型,单条消息最大允许字符 msgSound :false, //boolean型,是否启声音提醒,true:启,false:关闭,默认为true defaultWindow :"" //string型,登录后打新聊天窗口,此处接收的参数为联系人的uid,否则会出错 }); }); 详细说明文档 http://www.zi-han.net/case/im/help.html 示例 http://www.zi-han.net/developer/721.html 注意 请在服务器(如localhost)环境下打
鱼鱼 WEB IM 20090423 本程序版权归鱼鱼qq260332019所有, 此程序非经鱼鱼许可禁止用于商业用途, 作者保留该程序名称、源码的所有相关权利] 源码没有丝毫保留,全部放提供,请大家多提修改意见. 源码没有丝毫保留,全部放提供,请大家多提修改意见. 源码没有丝毫保留,全部放提供,请大家多提修改意见. '转发时请保留此声明信息,这段声明不并会影响你的速度! '*************************鱼鱼 WEB IM 2008-2009*********************************** ' '作者 鱼鱼(qq:260332019) '网站:http:// '电子邮件:260332019@qq.com 'WEB发群:4531488 'QQ:260332019 '版权声明:版权所有,源代码公,除商业用途外其他各种用途均可免费使用,但是修改后必须把修改后的文件 '发送一份给作者.并且保留作者此版权信息 '****************************************************************************** 目标:以前写过漫漫,但还不够好,鱼鱼要改进,比漫漫更好 在鱼鱼基础上发各种WEB应用,挂接到鱼鱼上,不断扩展 以鱼鱼为核心,完善鱼鱼好友、群、组等基本聊天功能 扩展鱼鱼,与各种WEB应用紧密结合,鱼鱼号码做为接口 发展鱼鱼,努力构建WEB版腾讯QQ,打造鱼鱼通用平台 以鱼鱼平台为基础,发各种WEB应用平台,凝聚平台效应 努力使鱼鱼更加优秀,让鱼鱼成为很好很强大的在线平台 运行regdll.bat注册fish.dll,然后可以正常访问,测试号码10000~10100,密码都为1 文件夹app是小应用文件夹,可扩展鱼鱼webim 2008-10-17始写鱼鱼 2008-10-18上午 基本完成数据库设计,包括了鱼鱼群表等,完成好友列表框架 2008-10-19完善好友列表框架,好友列表按状态显示,增加好友状态图标显示, 增加鱼鱼号码等级、头像、图标等 2008-10-21解决好友列表和在线人数无法显示bug,使用clng转换类型 注意条件判断时用clng转换鱼鱼号码 增加消息收发、查找用户 2008-10-23完善消息收发 2008-10-24增加鱼鱼个人设置,鱼鱼资料查看 2008-10-25艰难的完善好友操作,由于数据库设计得有些奇怪,程序非常难写,且问题很多 添加分组操作,增加分组消息提示 2008-10-26增加系统信息,上下栏,初步集成多用户博客平台 性能测试,结果显示好友人数200上限,还凑合 人数再多的话,由于10秒刷新好友列表,请求得不到即时响应,使用起来会不流畅 2008-10-27清晰化好友添加、删除、加入黑名单、移动好友的逻辑 2008-10-28增加发消息时表情选择 2008-11-19增加好友列表图标 2008-11-25修改左侧栏、左侧列表指针显示为默认箭头,用户登录后自动删除1周前所有聊天消息 2009-1-4 增加鱼鱼应用 2009-1-19 增加聊天窗口图标 2009-4-17 修改了一些程序错误 2009-4-20 修改了一些程序错误 2009-4-22 修改了一个dll错误 2009-4-23 数据库使用原来的~ 微蓝#CEDFF6 #F5FAFE 淡蓝#D5E3F4 #E4EFF8 #A4C3F6 #DBE1F4 #C5D6EF #C5E3F5 #E8F7FD #D5EBF9 #E3ECF9 #EFF9FE 浅蓝#A6C5E8 #BED7ED #DCEBFB #D4E3F6 #D3D8FD #D1E7FC 深蓝#4B92D9 #59AAEE #6891D3 #179BF6 #00551A #89AACF #D5E1EE #F5FAFE
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值