作为一个交互很多的web应用,良好的后端设计可以减少数据库访问、减轻服务器负载;良好的通讯模式更是可以较少服务器连接数、节省流量。这篇文章主要讲web即时通讯中常用的技术。
HTTP是无连接的,HTTP通讯过程基本就是:客户端发送请求给服务器,服务器接收请求给出响应信息,客户端接收响应信息显示在用户的显示器上,客户端断开连接。由此可知,要实现即时聊天中的”即时”,我们有两个办法:服务器抓住连接不断开和客户端不断的向服务器发起请求实现伪即时。当然用 Flash XMLSocket可以实现真正的即时通讯,但这样已经不是使用HTTP协议了,HTTP天生的优势(无需另外开端口、自动穿越防火墙)也就无法体现。
1.短轮询(polling):核心思想是客户端定时去服务器取消息。为了实现即时效果,轮询的间隔必须设计得足够短,另外为了操作的流畅,需要使用Ajax来发送请求。本人的QGYWebIM就是采用的此方案。这种方案的优点是:后端程序编写比较容易,发送完响应信息马上断开连接,不会占用太多服务器资源。缺点是一般情况下,频繁的请求中有大半是无用,这些冗余请求无形中浪费了带宽和服务器资源。我们可以通过判断用户的活跃程度来决策请求服务器的间隔,我在51的一个帖子 提到过这种方法,但是间隔一旦长了,消息的传送就有延时,违背了即时聊天的初衷了。
2.长轮询(long-polling):基本原理是客户端向服务器发送请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,连接被断开期间用户的新信息会被服务器缓存起来。客户端处理完响应信息后再向服务器发送新的请求。这种做法的优势是如果用户一直没新消息,客户端不会频繁的轮询去服务器取消息,节省了流量,但是服务器维持长连接是很消耗资源的。具体实现起来,前端这边基本不需要什么改动,依然是用Ajax轮询取信息,后端需要在没有新消息时处理一下。
3.长连接(streaming):其实很早以前就有人使用这种技术来实现聊天室的通讯。以前在页面中嵌入一个iframe,iframe里放一个使用长连接页面,服务器有新消息就会及时的在iframe里反映出来,再依靠客户端的脚本解析出来就OK了。这样做一个比较严重的问题是:使用 iframe请求长连接时,无论是IE还是firefox都会认为页面没有加载完而显示进度条,很难看。不过这个问题是可以解决的。firefox支持了Streaming Ajax ,在readyState为3的时候就能接受数据,所以问题不大;IE则只能在readyState为4,即连接断开时才能得到返回值。但是伟大的Google工程师使用了一个hack成功的解决了这个问题:使用一个被称为“htmlfile”的ActiveX ,把iframe放在这个ActiveX里就OK了。
// we were served from child.example.com but
// have already set document.domain to example.com
var currentDomain = "http://exmaple.com/";
var dataStreamUrl = currentDomain+"path/to/server.cgi";
var transferDoc = new ActiveXObject("htmlfile"); // !?!
// make sure it's really scriptable
transferDoc.open();
transferDoc.write("");
transferDoc.write("<script type="text/javascript"><!--
document.domain='"+currentDomain+"';
// --></script>");
transferDoc.write("");
transferDoc.close();
// set the iframe up to call the server for data
var ifrDiv = transferDoc.createElement("div");
transferDoc.appendChild(ifrDiv);
// start communicating
ifrDiv.innerHTML = "";
无疑,使用长连接对于用户来说是最好的方案,用户体验最好(消息能及时的到达)、占用用户带宽最少(不会发送无用的请求),但是会增加服务器的开销;长轮询是折中方案,Facebook IM 就是采用这种方案,不过做了一点改动:客户端发起的每个连接服务器都hold10S,这10S中新消息会源源不断的返回给客户端,10s后连接关闭,客户端发起下一个连接。这样做是因为Facebook的用户会不断的打开、关闭新页面,如果每个页面都建立一个永久的长连接,会阻塞浏览器其他请求,服务器也会吃不消的;短轮询因为实现起来简单,适用于小型应用。
[转自 :http://www.qgy18.com/2008/08/webim-design-transport/ ]
分享到:
相关推荐
"WEBIM"(Web即时通讯)技术就是实现这种实时通信的关键工具。本文将深入探讨WEBIM在网站开发中的用途,以及如何利用Sample.Client.rar这个压缩包资源进行实践。 **WEBIM的定义与工作原理** WEBIM,全称为Web ...
在"WebIM 即时通讯 网页聊天"这个项目中,C#源码被用于构建后台服务,这表明开发人员使用了C#编程语言和相关的.NET框架来处理用户交互、消息传递以及服务器端的数据存储和管理。C#是一种面向对象的编程语言,具有...
本文将详细介绍基于laychat、layIM、workerman和thinkphp5构建的WebIM即时通讯系统V2.0,帮助开发者理解和掌握这一系统的构建原理与核心功能。 首先,layIM是layui框架下的一款开源WebIM组件,它提供了一整套完善的...
《基于layerIM、Workerman和ThinkPHP5的WebIM即时通讯系统详解》 在现代互联网应用中,实时通信已经成为不可或缺的一部分,尤其是对于社交、协作工具等应用场景,WebIM(Web即时通讯)系统的存在使得用户无需安装...
总之,"WebIM for ThinkPHP"项目为电商和企业网站提供了一套完整的在线客服解决方案,结合了WebIM的实时通讯能力和ThinkPHP的开发便捷性,帮助开发者快速搭建高效、稳定的在线客服系统。如果你正面临如何在你的PHP...
2. **JavaScript框架**:WebIM通常基于JavaScript开发,常见的前端框架如React、Vue或Angular,它们提供了一套便捷的组件化开发模式,帮助开发者构建用户界面。 3. **实时消息传输**:为了实现实时聊天,需要一个...
WebIM(Web即时通讯)是指在Web浏览器中实现的即时通讯功能。在这个项目中,WebIM利用DWR3的Reverse Ajax和服务器推送技术,为用户提供了一个无需安装任何额外软件即可进行实时聊天的平台。用户可以通过Web页面与...
【标题】"WEBIM之Continuation方式实现"主要探讨的是在网络通信中,特别是Web即时通讯(WebIM)场景下,如何利用Continuation技术优化数据传输和处理的方式。Continuation是一种编程模式,它允许将一个操作分阶段...
6. **移动端支持**:为了满足多平台的需求,WebIM系统可能还需要有适应移动设备的版本,这可能需要EXTJS的响应式布局或专门的移动开发框架。 通过以上分析,我们可以看到,这个基于WebSocket和EXTJS的WebIM系统充分...
综上所述,这个Webim项目是一个基于B/S架构的即时通讯系统,它的设计思路可能参考了QQ,使用了.NET Framework 2005作为后端开发框架,结合SQL Server 2000作为数据存储,而客户端应用飞秋FeiQ.exe则为用户提供桌面端...
Vue.js是一个流行的JavaScript框架,它简化了构建用户界面的工作,提供了组件化开发模式,有利于代码复用和维护。Vue.js的响应式数据绑定和轻量级特性使其成为构建单页应用(SPA)的理想选择,尤其适合构建交互丰富...
Java WebIM(Web即时通讯)是一种在Web应用中实现用户实时通信的技术,它允许用户通过浏览器进行聊天、文件传输等活动,极大地增强了Web应用的交互性和实时性。在本案例中,由于之前的上传出现问题,现在提供了新的...
此外,消息的加密传输、用户身份验证和多设备同步也是WebIM开发中需要考虑的关键问题。 在提供的文件列表中,"Flex_WebIM_1.0_CatWindows_2.0_20110809.zip.002"可能是一个WebIM系统的源码或工具包,基于Adobe Flex...
Struts2是一款流行的Java Web开发框架,它基于MVC设计模式,为开发者提供了一种组织和控制应用程序逻辑的方式。WebIM则是一种在网页上实现即时通讯功能的技术,允许用户实现实时的在线聊天、消息传递等功能,无需...
【标题】"WebIM-for-Struts1 v1.0" 涉及的主要知识点是将即时通讯(Instant Messaging,简称IM)功能集成到基于Struts1的经典Web应用程序框架中。Struts1是一个开放源码的Java Web应用框架,它遵循Model-View-...
本项目是一个基于PHP和swoole技术实现的Web即时通讯(WebIM)系统,旨在提供一个高效、实时的在线聊天平台。以下是该项目的主要知识点: 1. **PHP**: - PHP是一种广泛使用的开源脚本语言,尤其适合Web开发。它...
"camewm5"可能是项目或组件的特定版本号,"easymob-webim"可能涉及到了EasyMob的Web即时通讯功能,而"mui_qq登录"暗示了这个登录界面设计是基于Mui并且仿照了QQ的登录样式。 描述提到,这个项目是一个简单的前端...
WebIM-for-Spring3是一个专为Spring MVC 3.2设计的即时通讯(Instant Messaging,简称IM)开发框架,旨在简化在Web应用程序中集成实时通信功能的过程。这个框架利用了Spring的强大功能,提供了稳定、高效的IM服务,...
"WebIM开发框架"表示这是一个完整的开发套件,包括了实现WebIM所需的所有组件和指导。"WebIM-for-Struts1"则是这个框架的具体版本,专为Struts1定制。 【压缩包子文件的文件名称列表】: 1. "使用帮助.txt" - 这是一...