開源框架Pushlet入門


一、comet基本概念
1.comet是一個用於描述客戶端和服務器之間交互的術語,即使用長期保持的http連接來在連接保持暢通的情況下支持客戶端和服務器間的事件驅動的通信。
2.傳統的web系統的工作流程是客戶端發出請求,服務器端進行響應,而comet則是在現有技術的基礎上,實現服務器數據、事件等快速push到客戶端,所以會出現一個術語”服務器推“技術。

            

二、push實現方式
1.原理:
利用jsp/servel技術,在不關閉http流的情況下push數據到客戶端瀏覽器;
2.實現:
基於ajax的長輪詢(long-polling)方式

               

ajax的出現使得javascript可以調用xmlhttprequest對象發出http請求,javascript響應處理函數根據服務器返回的信息對html頁面的顯示進行更新。使用ajax實現“服務器推”與傳統的ajax應用不同之處在於:

1)、服務器端會阻塞請求直到有數據傳遞或超時才返回。
2)、客戶端 javascript 響應處理函數會在處理完服務器返回的信息后,再次發出請求,重新建立連接。
3)、當客戶端處理接收的數據、重新建立連接時,服務器端可能有新的數據到達;這些信息會被服務器端保存直到客戶端重 新建立連接,客戶端會一次把當前服務器端所有的信息取回。

             

           

 Pushlet實例

一、首先建立一個web工程pushlet,將pushlet.jar放到lib目錄中,引入到工程。並且將pushlet.properties和sources.properties兩個文件拷貝到WEB-INF目錄中去。工程的目錄結構如圖示

我們一般只需要對sources.properties進行修改即可,創建的消息源必須在這個文件中進行配置。消息源需要實現EventSource接口          

 

二、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
>
<!--
注意,缺省不需要修改<url-pattern>/pushlet.srv</url-pattern>,如果修改,
需要在對應的js文件中也要修改。pushlt缺省就是通過pushlet.srv觸發servlet的。
-->
<servlet>
<servlet-name>pushlet</servlet-name>
<servlet-class>
nl.justobjects.pushlet.servlet.Pushlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>pushlet</servlet-name>
<url-pattern>/pushlet.srv</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

         

三、看一下index.jsp這個文件的內容

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String
path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>HelloWorld</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript" src="ajax-pushlet-client.js"></script>
<script type="text/javascript">
//對pushlet的初始化,觸發web.xml中的servlet。
PL._init();
//這里的監聽的主題,必須在sources.properties中配置的對象中聲明這個主題。
//sources.properties配置着事件源(EventSources),在服務器啟動時會自動激活。
//可以通過服務器的啟動記錄查看得到。可以將這個文件放到WEB-INF目錄下面或者classess目錄下面都可以。
PL.joinListen('/linjiqin/hw');
function onData(event) {
alert(event.get("hw"));
}
</script>
</head>

<body>
</body>
</html>

             

四、修改sources.properties文件

source1=nl.justobjects.pushlet.test.TestEventPullSources$TemperatureEventPullSource
source2=nl.justobjects.pushlet.test.TestEventPullSources$SystemStatusEventPullSource
source3=nl.justobjects.pushlet.test.TestEventPullSources$PushletStatusEventPullSource
source4=nl.justobjects.pushlet.test.TestEventPullSources$AEXStocksEventPullSource
source5=nl.justobjects.pushlet.test.TestEventPullSources$WebPresentationEventPullSource
source6=nl.justobjects.pushlet.test.TestEventPullSources$PingEventPullSource
#source1~source6是系統缺省自帶的,source7是我自己配置的,並且在index.jsp中的腳本中,
#配置的/linjiqin/hw是和這兒是對應的。具體是這樣的。HwPlushlet是com.ljq.test.HelloWorldPlushlet對象的一個內部類,
#並且繼承EventPullSource接口。
source7=com.ljq.test.HelloWorldPlushlet

 

五、核心代碼HelloWorldPlushlet

package com.ljq.test;

import java.io.Serializable;

import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.EventPullSource;

@SuppressWarnings("serial")
public class HelloWorldPlushlet extends EventPullSource implements Serializable {

/**
* 設置休眠時間
*/
@Override
protected long getSleepTime() {
return 1000;
}

/**
* 創建事件
*
* 業務部分寫在pullEvent()方法中,這個方法會被定時調用。
*/
@Override
protected Event pullEvent() {
Event event = Event.createDataEvent("/linjiqin/hw");
event.setField("hw", "HelloWorld!!!!");
return event;
}

}

        

這樣這個基本的例子就OK了,運行一下,看看吧。
訪問http://localhost:8083/pushletprj 會定時彈出alert窗口,窗口的內容如下圖:

        


如果這個頁面關閉了,服務器會自動取消訂閱,和移除對應的session信息。下面是我關閉頁面后,服務器端的輸出信息,如圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM