转:http://blog.lifeibo.com/?p=151#more-151
在很多情况下我需要实现服务器向客户端主发动推送数据的情况。而传统的http服务器模式是,客户端向服务器发送请求,服务器向客户端响应数据。显然这种方式无法满足需求。
当然,我们可以先容易的想到,客户端不停地向服务器发送求,以获取最新的数据。然而现在很多现实中的应用需要实现服务端将实时数据发送到客户端,而客户端无须不停的发送请求。下面是向种常见的实现方案:
实现方案一:基于客户端套接口的“服务器推”技术Flash XMLSocket
这种方案是基于flash来实现的,需要客户端安装flash播放器才能正常工作。使用时,我们在在 HTML 页面中内嵌入一个使用了
XMLSocket 类的 Flash 程序。JavaScript 通过调用此 Flash
程序提供的套接口接口与服务器端的套接口进行通信。JavaScript 在收到服务器端以 XML 格式传送的信息后可以很容易地控制 HTML
页面的内容显示。
实现方案二:基于 HTTP 长连接的“服务器推”技术:Comet
“服务器推”是一种很早就存在的技术,以前在实现上主要是通过客户端的套接口,或是服务器端的远程调用。因为浏览器技术的发展比较缓慢,没有为“服务器
推”的实现提供很好的支持,在纯浏览器的应用中很难有一个完善的方案去实现“服务器推”并用于商业程序。最近几年,因为 AJAX 技术的普及,以及把
IFrame 嵌在“htmlfile“的 ActiveX 组件中可以解决 IE 的加载显示问题,一些受欢迎的应用如
meebo,gmail+gtalk
在实现中使用了这些新技术;同时“服务器推”在现实应用中确实存在很多需求。因为这些原因,基于纯浏览器的“服务器推”技术开始受到较多关注,Alex
Russell(Dojo Toolkit 的项目 Lead)称这种基于 HTTP
长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。目前已经出现了一些成熟的 Comet 应用以及各种开源框架;一些 Web
服务器如 Jetty 也在为支持大量并发的长连接进行了很多改进。
下面将介绍两种 Comet 应用的实现模型。
基于 AJAX 的长轮询(long-polling)方式
AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行更新。
这样,服务器会阻塞请求,直到有数据可以返回或超时才返回;客户端JavaScript会处理完客户端发送完的数据后,再次发送请求;当客户端处理接收的
数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。
基于 Iframe 及 htmlfile 的流(streaming)方式
这种方式是在页面中加入一个隐藏的iframe页面,这个iframe请求的是一个长连接的服务端,服务端通过这个长连接,就可以将数据发送到客户端。一般iframe服务器不会直接返回显示的数据,而是返回对客户端 Javascript 函数的调用,如“”。服务器端将返回的数据作为客户端 JavaScript 函数的参数传递;客户端浏览器的 Javascript 引擎在收到服务器返回的 JavaScript 调用时就会去执行代码。
使用 Comet 模型开发自己的应用
上面介绍了两种基于 HTTP 长连接的“服务器推”架构,更多描述了客户端处理长连接的技术。对于一个实际的应用而言,系统的稳定性和性能是非常重要的。将 HTTP 长连接用于实际应用,很多细节需要考虑。
不要在同一客户端同时使用超过两个的 HTTP 长连接
我们使用 IE 下载文件时会有这样的体验,从同一个 Web
服务器下载文件,最多只能有两个文件同时被下载。第三个文件的下载会被阻塞,直到前面下载的文件下载完毕。这是因为 HTTP 1.1
规范中规定,客户端不应该与服务器端建立超过两个的 HTTP 连接, 新的连接会被阻塞。而 IE 在实现中严格遵守了这种规定。
HTTP 1.1 对两个长连接的限制,会对使用了长连接的 Web 应用带来如下现象:在客户端如果打开超过两个的 IE 窗口去访问同一个使用了长连接的 Web 服务器,第三个 IE 窗口的 HTTP 请求被前两个窗口的长连接阻塞。
所以在开发长连接的应用时, 必须注意在使用了多个 frame 的页面中,不要为每个 frame 的页面都建立一个 HTTP 长连接,这样会阻塞其它的 HTTP 请求,在设计上考虑让多个 frame 的更新共用一个长连接。
服务器端的性能和可扩展性
一般 Web 服务器会为每个连接创建一个线程,如果在大型的商业应用中使用 Comet,服务器端需要维护大量并发的长连接。在这种应用背景下,服务器端需要考虑负载均衡和集群技术;或是在服务器端为长连接作一些改进。
有一个基于nginx的comet模块的实现,充分利用了nginx支持高连接数的优势,很好地实现了comet技术,以后会向大家进行介绍。
控制信息与数据信息使用不同的 HTTP 连接
使用长连接时,存在一个很常见的场景:客户端网页需要关闭,而服务器端还处在读取数据的堵塞状态,客户端需要及时通知服务器端关闭数据连接。服务器在收到关闭请求后首先要从读取数据的阻塞状态唤醒,然后释放为这个客户端分配的资源,再关闭连接。
所以在设计上,我们需要使客户端的控制请求和数据请求使用不同的 HTTP 连接,才能使控制请求不会被阻塞。
在实现上,如果是基于 iframe 流方式的长连接,客户端页面需要使用两个
iframe,一个是控制帧,用于往服务器端发送控制请求,控制请求能很快收到响应,不会被堵塞;一个是显示帧,用于往服务器端发送长连接请求。如果是基
于 AJAX 的长轮询方式,客户端可以异步地发出一个 XMLHttpRequest 请求,通知服务器端关闭数据连接。
在客户和服务器之间保持“心跳”信息
在浏览器与服务器之间维持一个长连接会为通信带来一些不确定性:因为数据传输是随机的,客户端不知道何时服务器才有数据传送。服务器端需要确保当客户端不再工作时,释放为这个客户端分配的资源,防止内存泄漏。因此需要一种机制使双方知道大家都在正常运行。在实现上:
1.服务器端在阻塞读时会设置一个时限,超时后阻塞读调用会返回,同时发给客户端没有新数据到达的心跳信息。此时如果客户端已经关闭,服务器往通道写数据会出现异常,服务器端就会及时释放为这个客户端分配的资源。
2.如果客户端使用的是基于 AJAX 的长轮询方式;服务器端返回数据、关闭连接后,经过某个时限没有收到客户端的再次请求,会认为客户端不能正常工作,会释放为这个客户端分配、维护的资源。
3.当服务器处理信息出现异常情况,需要发送错误信息通知客户端,同时释放资源、关闭连接。
分享到:
相关推荐
在Web开发中,服务器推技术能够实现实时性更强的应用场景,如在线聊天、股票实时更新、游戏状态同步等。VS2008是Visual Studio 2008的缩写,是微软开发的一款集成开发环境,广泛用于创建ASP.NET应用程序。 "asp.net...
服务器推技术是网络应用中的一种重要机制,它与传统的客户端请求、服务器响应的HTTP协议模型不同,服务器推技术允许服务器主动地将数据推送给客户端,而无需客户端发起新的请求。这种技术在实时性要求较高的场景中,...
### 服务器推技术详解 #### 一、引言 服务器推技术是一种使服务器能够主动将数据推送至客户端的技术。与传统的客户端轮询模式相比,它更高效、响应速度更快。在互联网时代,随着用户对实时性需求的提高,服务器推...
服务器推技术通常用于实时数据更新,例如股票报价、在线聊天或实时天气预报等。传统的HTTP协议是基于请求-响应模型的,而服务器推打破了这种模式,使服务器可以在需要时主动推送信息。 在Java Applet中实现服务器推...
服务器推技术是现代互联网应用程序,特别是实时通信应用如聊天室中的关键组成部分。它与传统的HTTP请求-响应模型不同,服务器推技术允许服务器主动地将数据发送到客户端,而无需客户端发起新的请求。这一机制极大地...
在描述中提到的"DWR服务器推技术整合Struts2",意味着我们将DWR与流行的MVC框架Struts2相结合,以创建一个具有聊天功能的Web应用。Struts2提供了一个强大的架构来处理HTTP请求,并结合DWR,可以创建一个动态的、交互...
【Pushlet服务器推技术】是一种实时通信技术,主要用于构建能够实时推送信息的Web应用程序,比如聊天、股票更新、在线游戏等场景。Pushlet是基于Java的开源项目,它利用了HTTP的长连接特性,实现了服务器主动向...
ASP.NET的服务器推技术方案一真都很少见应用实例,根据网络上资料的整理开发了一个DLL,可以很方便在应用推技术。 1.取代传统的AJAX方式将得到更好的用户体验,页面仍然无刷新; 2.不再定时不断请求Http请求,降低...
DWR是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
【服务器推技术之Juggernaut】是关于一种实时通信技术的讨论,主要集中在Web开发领域。Juggernaut是一种用于Rails应用的服务器推送技术,它允许服务器主动向客户端发送数据,而不仅仅是响应客户端的请求,从而实现更...
【标题】:“Tomcat comet 服务器推技术” Tomcat 的 Comet 技术是一种基于 HTTP 长连接的服务器推送技术,允许服务器在客户端保持一个开放的 HTTP 连接,从而能够在数据准备好时立即推送到客户端,而无需客户端...
在DWR中,服务器推技术主要通过两个关键组件来实现:`TestReverseAjax`和`TestPushlet`。 1. **TestReverseAjax**: `TestReverseAjax`通常是一个示例类,用于演示如何使用DWR的反向AJAX功能。反向AJAX是指服务器...
本文主要讨论了一种基于Comet服务器推技术的Pushlet实现,这种技术允许服务器向客户端实时推送数据,而无需客户端持续发起请求。 Comet技术是一种优化的Web通信模式,其核心思想是利用持久化HTTP连接来实现实时数据...
"dwr实现服务器推技术,兼容低版本IE"这一主题,表明我们将讨论如何利用DWR实现在旧版Internet Explorer上的服务器推送功能。 1. **DWR基础原理** DWR的核心在于创建一个JavaScript对象,该对象可以直接调用服务器...
总之,通过Flash的XMLSocket和Java的Socket配合服务器推技术,我们可以构建起一个高效的双向通信系统。在处理中文字符时,关键是保持两端编码的一致性,以避免乱码问题。同时,正确地处理网络异常和重连逻辑,能够...
服务器推送技术
为了解决这个问题,我们可以采用两种主要的服务器推技术:长轮询和WebSocket。 1. **长连接(Long Polling)**: 长连接是一种模拟服务器推的方法,它通过延长HTTP请求的生命周期来实现。客户端发送请求到服务器,...
服务器推送技术是网络应用中的一种优化策略,它允许服务器主动将数据发送到客户端,而不仅仅是响应客户端的请求。这种技术可以显著减少延迟,提高实时性,尤其适用于实时更新的应用,如股票报价、在线聊天或者游戏...