`
huangxx
  • 浏览: 321866 次
  • 来自: ...
社区版块
存档分类
最新评论

PUSHLET 实战:JavaScript是否在html完全显示后执行

阅读更多
 else if (eventType == 'listen-ack') {
		_setStatus('listening');
		_doCallback(event, window.onListenAck);

	// Send empty heartbeat event. This
		// silences many busy browser windows.
		// At least in Moz and IE.
		alert("在push方式下服务端持续发数据,正常情况下后面的语句继续执行");
		p_heartbeat();
	} 

 

查看pushlet服务端发送侦听确认后,客户端收到一段内容后(服务端持续发送)是否立刻执行,答案见下:

 

 [JavaScript脚本中的alert的问题]的几个有争议的地方有:
    1:html是否在完全被传送到客户段之后才显示?
    2:JavaScript是否在html完全显示后执行?
    3:如果JavaScript在html没有被完全显示就可以执行,那么此时的alert会不会是浏览器本身与服务器端的通信处于等待状态?( [JavaScript脚本中的alert的问题]alert状态下,浏览器会处于等待状态是指浏览器自身当前的线程处于等待状体)
    首先我们先假设html是在完全被传送到客户段之后才显示。那么我们在打开网页的时候也就会有这种现象出现:如果打开很大的网页(指数据比较多,图片很大)时候,刚刚打开的时候会是一片空白,过了一段时间之后画面会突然出现。空白的时候是浏览器在与服务器请求数据,由于数据很大,请求的时间就会相应长。那么在这段时间内由于html数据没有传送完成,浏览器不会显示html的信息,所以会一片空白。
    对此我做了一个测试试样:

private void Page_Load(object sender, System.EventArgs e)
{
    
for(int i=0;i<50;i++)
    
{
        
this.Page.Response.Write("<table> <tr><td>");
            
using (FileStream fs = File.OpenRead(@"D:\Inetpub\wwwroot\Test\123.bmp")) 
            
{
                
byte[] b = new byte[1024];                
                
while (fs.Read(b,0,b.Length) > 0
                
{
                    
this.Page.Response.Write(b);
                }

            }

        
this.Page.Response.Write("</table> </tr></td>");
    }

}

我通过直接将一大文件往网页内写。文件是一张比较大的图片:有2M多,通过50次的循环读写,那么发送到客户段的数据超过100M,这样浏览器的处理起来的时候就会比较慢。从测试的结果是浏览器逐步的显示出接收到的内容。与期望的一次性显示并不相同。
对于这个显现的原因是:浏览器在接收到的数据中,每当接受到一个完整的Table内容后就会显示,并不是将所有的数据都接收完成后一次性的显示出来。这种显现可能大伙在访问图片比较多的网站的时候可能会常常遇到,打开一个网页等了半天还是只显示了一部分。
这就说明了1:html是不是在完全被传送到客户段之后显示。
    对于第二个问题我假设JavaScript脚本是在Html显示完全后才能被执行,对于设计的测试方法我只是简单的在循环操作开始前添加如下面依据话:
    this.Page.Response.Write("<SCRIPT >alert(\"ee\");</SCRIPT>");
    假如JavaScript脚本是在Html显示完全后才能被执行,那么在所有的信息显示完全之前不会弹出alert对话框。但是测试的结果是在页面内容显示之前就执行了脚本。
接下来网页会继续往下显示。
   对于这个现象的原应是:浏览器在接受到部分相对完整的数据(比如说一个Table)就显示。在显示过程中如果遇到脚本就会执行。
这就说明了2:JavaScript脚本在是在Html显示过程中可以被执行。
由于有了1和2的不成立,才可以推断3。如果1和2都成立的话,那么由于脚本是在Html被发送完成之后再执行,那么此时浏览器已经与服务器断开的通信(由于HTTP协议的特点,在服务器将浏览器请求的数据发送完成之后,即断开与客户机的连接操作)那么此时执行alert即时使浏览器当前线程处于等待状态,也不会对服务器造成任何影响)
       由于1和2的测试结果使3的答案无法定论。所以假设会给服务器造成压力,而造成压力的理由是:由于alert使浏览器处于等待状态,这个时候可能与服务器的通信还没有终止,所以会使客户端与服务器长时间连接在一起,从而造成压力。如果上叙理由成立,那么此时监视服务器就会发现IIS当前会一直处于激活状态。
       通过软件测试,首先把IIS中的站点属性设置中将[启用HTTP激活]去掉。然后通过软件简单的监视IIS的连接数。
     测试的结果是在alert没有被关闭之前,IIS并没有保持激活状态,这也就说明IIS并没有与客户端一直保持通信协议。
       对于这个现象的原应是:由于通信协议的特点决定的,由于网络通信协议中是自底向上服务的特点,HTTP协议也是通过网络中的TCP/IP协议进行通信。由于通信协议的服务特点,所以即使是浏览器处于正待状态,这并不影响底层的TCP通信。因为TCP自下向上服务,对于上层调用不去过多的理会下层的操作状态。
    好了这个问题也就解释清楚了,希望能够对大伙有所帮助。

分享到:
评论

相关推荐

    服务器推送pushlet讲解

    2. 创建Pushlet客户端:在客户端页面中,创建一个JavaScript或Java客户端来建立与Pushlet服务器的连接,并订阅感兴趣的数据源。 3. 实现Pushlet服务端:在服务器端,你需要编写Java代码来处理事件,并在事件触发时...

    pushlet javascript push

    4. 客户端接收到数据后,使用JavaScript更新页面内容,显示新消息。 5. 客户端可以选择在特定条件下(如接收到指定消息或达到一定数量)关闭连接,或者让连接一直保持打开状态,持续接收推送。 四、helloPushlet...

    pushlet简单配置应用

    5. **客户端JavaScript使用**:在HTML页面中,你需要引入`ajax-pushlet-client.js`这个客户端JavaScript库。然后,通过调用`PL._init()`初始化Pushlet,`PL.joinListen('/pushlet/test')`订阅特定的主题,例如'/...

    Pushlet简单应用小结

    - 创建Pushlet Client:在客户端,需要引入Pushlet的JavaScript库,并初始化一个连接对象,设置监听的频道。 - 建立连接:客户端向服务器发起HTTP请求,请求保持连接状态。 - 服务器处理:服务器接收请求后,将...

    Pushlet学习(二) -- Pushlet CookBook部分翻译 + 注释

    Pushlet是Java中的一种推技术,它允许服务器主动向客户端推送数据,而不仅仅是响应客户端的请求。在Web应用中,这种技术打破了传统的HTTP长轮询或短轮询机制,提供了实时性更好的通信方式。本篇内容主要围绕"Pushlet...

    Pushlet简单示例测试

    Pushlet客户端建立与服务器的持久连接后,服务器可以在准备好新数据时立即推送给客户端,而不是等待客户端发起新的请求。 在"PushletTest2"这个例子中,我们可以预期包含以下组件: 1. **Pushlet服务器**:这是...

    pushlet

    Pushlet Client则是在用户端运行的程序,它负责与服务器建立持久连接,并接收服务器推送过来的数据。 Pushlet 2.0.3是该技术的一个特定版本,可能包含以下关键特性: 1. **持久连接**:通过保持一个开放的HTTP连接...

    pushlet实现简单的用户聊天

    在IT行业中,Pushlet是一种基于Java的推送技术,主要用于实现实时的数据传输,尤其是在Web应用中创建实时聊天、通知服务等功能。Pushlet是基于HTTP连接持久化的概念,它允许服务器主动向客户端推送数据,而无需...

    修改后的pushlet的jar包和js

    【标题】"修改后的pushlet的jar包和js"涉及的核心技术是Pushlet,这是一个用于实现服务器向客户端推送数据的技术。Pushlet是一个基于Java的开源项目,它允许服务器主动将信息推送到客户端,而无需客户端持续发送请求...

    pushlet使用说明(包括中文乱码)

    在客户端,你需要在 HTML 页面中引入 ajax-pushlet-client.js 文件,这提供了与 Pushlet 交互的 JavaScript API。使用这些 API,你可以初始化 Pushlet,如 `PL._init()`,然后订阅你想接收数据的主题,例如 `listen...

    pushlet 之 Pushlet使用手把手实例

    2. 创建客户端:客户端通常是一个Web应用,使用JavaScript或者Java Applet来实现与Pushlet服务器的交互。你需要编写代码创建一个持久的HTTP连接,并注册订阅感兴趣的事件。 3. 编写服务器端逻辑:在服务器端,你...

    pushlet文档和项目

    在实际应用中,Pushlet通常与JavaScript库配合使用,以便在客户端处理接收到的事件。例如,当服务器推送一个新的消息时,JavaScript可以更新网页内容,无需用户刷新页面。 要使用Pushlet,开发者首先需要在服务器上...

    pushlet.jar(2.0.4)

    Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣...当在client中使用JavaScript/DHTML时,Pushlet提供了通过脚本快速建立应用、使用HTML/CSS特性集成和布局新内容的便利方法。

    comet 框架 之 pushlet

    2. **Pushlet Client**:客户端库提供了一套API,允许开发者在JavaScript、Java或其他语言中创建与Pushlet Server的连接,并订阅感兴趣的事件或数据流。 3. **Event Source**:这是服务器端的数据源,可以是数据库...

    PUSHLET即时通讯工程实例

    但在PUSHLET中,服务器可以在客户端打开一个持久连接后,通过这个连接主动发送数据,实现"推"的效果。这大大减少了网络延迟,提高了用户体验。 **部署环境** 本实例是在Tomcat应用服务器上运行的,因此你需要确保...

    网页推送pushlet的demo

    4. **连接服务器**:在浏览器或其他客户端程序中,使用JavaScript或者相应的客户端库建立到Pushlet Server的连接。 5. **测试推送**:触发事件生产者产生数据更新,观察客户端是否能正确接收到并显示。 6. **断开...

    PushLet实例,可直接运行

    在实际应用中,PushLet可以与各种前端技术(如JavaScript、jQuery、WebSocket等)结合,构建出交互性强、用户体验优秀的实时Web应用。同时,由于PushLet基于Java,所以它可以很好地融入Java EE环境,与其他企业级...

    pushlet定时向页面发送消息demo

    Pushlet是一种基于Java的实时推送技术,用于在服务器端向客户端浏览器实时推送数据,而无需客户端不断轮询请求。在Web应用中,Pushlet技术能够实现服务器主动将更新信息推送到客户端,提高了交互性和响应速度。这个...

    pushlet例子

    Pushlet客户端通常是一个JavaScript脚本,它在用户浏览器中运行,用于建立与服务器的连接并接收推送的数据。 1. **Pushlet服务器端实现** - Pushlet服务器端使用Servlet监听客户端的连接。当客户端连接到服务器时...

Global site tag (gtag.js) - Google Analytics