pushlet原理

发布网友 发布时间:2024-10-18 22:12

我来回答

1个回答

热心网友 时间:2024-10-18 22:56

Pushlet的基本使用形式极为简单,通常在多媒体视频、通讯应用中,如QuickTime,实现这一功能。Pushlet基于HTTP流技术,与加载HTTP页面后立即关闭连接的做法不同,它采用HTTP流方式主动推送新变更的数据到客户端,且在此期间HTTP连接始终保持打开状态。实现这种Keep-alive长连接的具体技术细节,请参考Sun提供的《HTTP Persistent Connection》和W3C的《HTTP1.1规范》。下面将通过示例来说明如何使用Pushlet。

示例1:

我们可以通过开发一个JSP页面,利用HTTP流技术不断向客户端发送新的HTML内容。该页面在一个定时器循环中实现这一功能:

<%
int i = 1
try { while (true) { out.print(""+(i++)+"")
out.flush()
try { Thread.sleep(3000)
} catch (InterruptedException e) { out.print(""+e+"")
} } } catch (Exception e) { out.print(""+e+"")
}%>

上述示例中,我们利用JSP页面不断向客户端推送内容,但这种做法并不实用,因为新内容被机械地、持续不断地添加到页面中,而不是服务器端更新的内容。

示例2:

现在,让我们深入探讨Pushlet的工作原理。通过运行Pushlet的示例源代码(examples/basics/push-js-stream.html),我们可以看到一个每3秒刷新一次的页面。那么它是如何实现的呢?

此示例包含了三个文件:push-js-stream.html、push-js-stream-pusher.jsp、push-js-stream-display.html。其中,push-js-stream.html为主框架文件,它以HTML Frame形式包含其他两个页面。

push-js-stream-pusher.jsp是一个JSP,执行在服务器端,其内容如下:

<%
/** Start a line of JavaScript with a function call to parent frame. */
String jsFunPre = " ";

int i = 1;
try {
// Every three seconds a line of JavaScript is pushed to the client
while (true) {
// Push a line of JavaScript to the client
out.print(jsFunPre+"Page "+(i++)+jsFunPost);
out.flush();
// Sleep three secs
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// Let client display exception
out.print(jsFunPre+"InterruptedException: "+e+jsFunPost);
}
}
} catch (Exception e) {
// Let client display exception
out.print(jsFunPre+"Exception: "+e+jsFunPost);
}
%>

在示例1和示例2中使用JSP时存在一个问题:一些Servlet引擎在某个客户端离开时会“吃掉”IOException,导致JSP页面永远不会抛出此异常。因此,Pushlet采用Servlet的原因之一是能够捕获到IOException。在示例代码的第21行,可以看到在一个定时器循环(3秒/周期)中打印了一些HTML内容并输出到客户端浏览器。请注意,这里推送的并非HTML而是JavaScript!

下面是JavaScript代码示例:

push-js-stream.html中的push()函数被名为pushletFrame的JSP Frame调用,将传入的参数值写入到displayFrame(此Frame为push-js-stream-display.html)。这是动态HTML的一个小技巧:使用document对象的writeln方法刷新某个Frame或Window的内容。

displayFrame成为了用于显示内容的、真正的视图。displayFrame初始化为黑色背景并显示“wait…”直到来自服务器的内容被推送过来:
WAIT...

这就是Pushlet的基本做法:从Servlet(或示例中的JSP)将JavaScript代码作为HTTP流推送到浏览器。这些代码被浏览器的JavaScript引擎解释并完成一些有趣的工作。因此,实现了从服务器端的Java到浏览器中的JavaScript的回调。

上述示例展示了Pushlet原理,但存在一些等待解决的问题和需要增强的特性。因此,建立了一个小型的服务器端Pushlet框架,并添加了一些用于客户端的JavaScript库。由于客户端需要依赖更多的DHTML特性(例如Layers),我们首先简要复习一些DHTML知识。示例代码见examples/dhtml。

DHTML(动态HTML)提供了在浏览器中维护内容、进行用户交互的扩展能力。就像Java开发者使用Servlet和JSP那样,DHTML也应该是你的工具箱中的一部分。

DHTML涉及到HTML、级联样式表(CSS)、JavaScript和DOM。传统的页面只能通过重新加载来自服务器的新页面进行更新。DHTML提供了在页面被加载完毕后对浏览器内的HTML文档的完全控制。你应该见过一些带有“图像翻滚”、弹出内容、可收缩菜单功能的网页,它们便是使用DHTML技术实现的。尽管存在一些标准差异(见下面的“跨浏览器DHTML”),大多数兼容JavaScript1.4版本的浏览器(后面将简称为“版本4的浏览器”)都支持DHTML。

从开发者角度审视浏览器中的整个文档,如Frame、图片、表格等,它们都可以表示为具有层次的对象模式——DOM。通过使用JavaScript可以维护DOM成员,不仅可以改变文档的内容和外观,还可以捕捉例如鼠标移动、form提交这些用户事件,然后对DOM进行相应修改。例如,鼠标移动到图片上方可以产生“mouse-over”事件,这时通过显示高亮版本的图片或弹出解释性文字的方式修改页面外观。这听起来不错吧!我们现在就熟悉一下DHTML标准!但谁定义了DHTML标准?

这是DHTML初学者首先遇到的问题。首先,你需要一个版本4以上的浏览器。DHTML相关规范的官方标准出自World Wide Web Consortium (W3)。然而,微软和Netscape出品的版本4以上的浏览器都有一些私有的DHTML扩展,这是你必须注意的。

幸运的是,大多数用户都有版本4以上的浏览器,并且一些开发者(如Dannymen、Dan Steinman和Danny Goodman)建造了跨越浏览器的、可重用的DHTML库。

作为一名Java开发者,你应该适当地理解基于对象、甚至面向对象的JavaScript编程。在我的DHTML中你将找到一些示例,但了解更多的DHTML资源也是非常值得的。尤其在使用跨越浏览器的DHTML库对付那些顽固的浏览器问题时,一切都变得有趣、而不是枯燥。

就如Java获得在广阔的服务器端市场、DHTML在客户端领域具有许多强大特性那样,Pushlet以一种直接的方式将这两项伟大的技术捆绑在一起。接下来的章节将详细讨论Pushlet这个服务器端轻量级框架和客户端DHTML库。

热心网友 时间:2024-10-18 23:01

Pushlet的基本使用形式极为简单,通常在多媒体视频、通讯应用中,如QuickTime,实现这一功能。Pushlet基于HTTP流技术,与加载HTTP页面后立即关闭连接的做法不同,它采用HTTP流方式主动推送新变更的数据到客户端,且在此期间HTTP连接始终保持打开状态。实现这种Keep-alive长连接的具体技术细节,请参考Sun提供的《HTTP Persistent Connection》和W3C的《HTTP1.1规范》。下面将通过示例来说明如何使用Pushlet。

示例1:

我们可以通过开发一个JSP页面,利用HTTP流技术不断向客户端发送新的HTML内容。该页面在一个定时器循环中实现这一功能:

<%
int i = 1
try { while (true) { out.print(""+(i++)+"")
out.flush()
try { Thread.sleep(3000)
} catch (InterruptedException e) { out.print(""+e+"")
} } } catch (Exception e) { out.print(""+e+"")
}%>

上述示例中,我们利用JSP页面不断向客户端推送内容,但这种做法并不实用,因为新内容被机械地、持续不断地添加到页面中,而不是服务器端更新的内容。

示例2:

现在,让我们深入探讨Pushlet的工作原理。通过运行Pushlet的示例源代码(examples/basics/push-js-stream.html),我们可以看到一个每3秒刷新一次的页面。那么它是如何实现的呢?

此示例包含了三个文件:push-js-stream.html、push-js-stream-pusher.jsp、push-js-stream-display.html。其中,push-js-stream.html为主框架文件,它以HTML Frame形式包含其他两个页面。

push-js-stream-pusher.jsp是一个JSP,执行在服务器端,其内容如下:

<%
/** Start a line of JavaScript with a function call to parent frame. */
String jsFunPre = " ";

int i = 1;
try {
// Every three seconds a line of JavaScript is pushed to the client
while (true) {
// Push a line of JavaScript to the client
out.print(jsFunPre+"Page "+(i++)+jsFunPost);
out.flush();
// Sleep three secs
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// Let client display exception
out.print(jsFunPre+"InterruptedException: "+e+jsFunPost);
}
}
} catch (Exception e) {
// Let client display exception
out.print(jsFunPre+"Exception: "+e+jsFunPost);
}
%>

在示例1和示例2中使用JSP时存在一个问题:一些Servlet引擎在某个客户端离开时会“吃掉”IOException,导致JSP页面永远不会抛出此异常。因此,Pushlet采用Servlet的原因之一是能够捕获到IOException。在示例代码的第21行,可以看到在一个定时器循环(3秒/周期)中打印了一些HTML内容并输出到客户端浏览器。请注意,这里推送的并非HTML而是JavaScript!

下面是JavaScript代码示例:

push-js-stream.html中的push()函数被名为pushletFrame的JSP Frame调用,将传入的参数值写入到displayFrame(此Frame为push-js-stream-display.html)。这是动态HTML的一个小技巧:使用document对象的writeln方法刷新某个Frame或Window的内容。

displayFrame成为了用于显示内容的、真正的视图。displayFrame初始化为黑色背景并显示“wait…”直到来自服务器的内容被推送过来:
WAIT...

这就是Pushlet的基本做法:从Servlet(或示例中的JSP)将JavaScript代码作为HTTP流推送到浏览器。这些代码被浏览器的JavaScript引擎解释并完成一些有趣的工作。因此,实现了从服务器端的Java到浏览器中的JavaScript的回调。

上述示例展示了Pushlet原理,但存在一些等待解决的问题和需要增强的特性。因此,建立了一个小型的服务器端Pushlet框架,并添加了一些用于客户端的JavaScript库。由于客户端需要依赖更多的DHTML特性(例如Layers),我们首先简要复习一些DHTML知识。示例代码见examples/dhtml。

DHTML(动态HTML)提供了在浏览器中维护内容、进行用户交互的扩展能力。就像Java开发者使用Servlet和JSP那样,DHTML也应该是你的工具箱中的一部分。

DHTML涉及到HTML、级联样式表(CSS)、JavaScript和DOM。传统的页面只能通过重新加载来自服务器的新页面进行更新。DHTML提供了在页面被加载完毕后对浏览器内的HTML文档的完全控制。你应该见过一些带有“图像翻滚”、弹出内容、可收缩菜单功能的网页,它们便是使用DHTML技术实现的。尽管存在一些标准差异(见下面的“跨浏览器DHTML”),大多数兼容JavaScript1.4版本的浏览器(后面将简称为“版本4的浏览器”)都支持DHTML。

从开发者角度审视浏览器中的整个文档,如Frame、图片、表格等,它们都可以表示为具有层次的对象模式——DOM。通过使用JavaScript可以维护DOM成员,不仅可以改变文档的内容和外观,还可以捕捉例如鼠标移动、form提交这些用户事件,然后对DOM进行相应修改。例如,鼠标移动到图片上方可以产生“mouse-over”事件,这时通过显示高亮版本的图片或弹出解释性文字的方式修改页面外观。这听起来不错吧!我们现在就熟悉一下DHTML标准!但谁定义了DHTML标准?

这是DHTML初学者首先遇到的问题。首先,你需要一个版本4以上的浏览器。DHTML相关规范的官方标准出自World Wide Web Consortium (W3)。然而,微软和Netscape出品的版本4以上的浏览器都有一些私有的DHTML扩展,这是你必须注意的。

幸运的是,大多数用户都有版本4以上的浏览器,并且一些开发者(如Dannymen、Dan Steinman和Danny Goodman)建造了跨越浏览器的、可重用的DHTML库。

作为一名Java开发者,你应该适当地理解基于对象、甚至面向对象的JavaScript编程。在我的DHTML中你将找到一些示例,但了解更多的DHTML资源也是非常值得的。尤其在使用跨越浏览器的DHTML库对付那些顽固的浏览器问题时,一切都变得有趣、而不是枯燥。

就如Java获得在广阔的服务器端市场、DHTML在客户端领域具有许多强大特性那样,Pushlet以一种直接的方式将这两项伟大的技术捆绑在一起。接下来的章节将详细讨论Pushlet这个服务器端轻量级框架和客户端DHTML库。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com