亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Pushlet框架改進(jìn)及其應(yīng)用整合

        2012-05-12 02:47:40李賽男余金山
        關(guān)鍵詞:服務(wù)器端消息客戶端

        李賽男 ,余金山

        (1.華僑大學(xué) 計(jì)算機(jī)科學(xué)與計(jì)算學(xué)院,福建 廈門 361021;2.華僑大學(xué) 計(jì)算機(jī)科學(xué)與計(jì)算學(xué)院,福建 泉州 362011)

        一些實(shí)時(shí)監(jiān)控、在線即時(shí)通信、RIA的Web應(yīng)用等系統(tǒng)狀態(tài)發(fā)生變化時(shí)需要及時(shí)反饋數(shù)據(jù)給客戶端。這種實(shí)時(shí)交互可以利用推技術(shù)來實(shí)現(xiàn)。隨著Ajax技術(shù)的興起,系統(tǒng)的實(shí)時(shí)性也出現(xiàn)新的解決方案——服務(wù)器推送(Comet[1])。服務(wù)器推送不同于以往的推技術(shù),它是基于Web平臺(tái)、通過Http長(zhǎng)連接、無須安裝插件的服務(wù)器向客戶端推送數(shù)據(jù)的純?yōu)g覽器技術(shù)。

        服務(wù)器推送是通過保持客戶端與服務(wù)器端的Http連接,當(dāng)服務(wù)器端狀態(tài)發(fā)送變化時(shí),將數(shù)據(jù)發(fā)送給客戶端瀏覽器,由瀏覽器負(fù)責(zé)顯示這些數(shù)據(jù),然后連接繼續(xù)被維持,等待下一次服務(wù)器推送[2]。

        Pushlet是一種輕量級(jí)的服務(wù)器推送開源框架,相對(duì)于其他流行的推送框架如Dojo+Jetty、DWR等,Pushlet有以下優(yōu)點(diǎn):

        (1)通用性。Pushlet框架是基于 Servlet實(shí)現(xiàn)的,可以在任何一種支持Servlet的服務(wù)器上運(yùn)行。

        (2)簡(jiǎn)單易用。Pushlet提供了一組簡(jiǎn)明用戶接口,使用戶能方便地使用Pushlet框架,而且客戶端使用Java Script技術(shù),可以很容易與已有的Web應(yīng)用程序集成。

        (3)可配置性。Pushlet使用屬性文件配置框架中的各種組件,用戶可以用自己開發(fā)的組件替換Pushlet提供的組件。

        (4)擴(kuò)展性。對(duì)于比較復(fù)雜的推送應(yīng)用,用戶可以自由擴(kuò)展Pushlet框架。

        (5)協(xié)議簡(jiǎn)單。Pushlet的客戶端和服務(wù)器端交互采用的協(xié)議是經(jīng)過簡(jiǎn)化的bayeux協(xié)議。

        但是Pushlet主要關(guān)注Comet服務(wù)器端的實(shí)現(xiàn),相對(duì)其在數(shù)據(jù)傳輸和客戶端方面設(shè)計(jì)實(shí)現(xiàn)上存在一些不足:

        (1)Pushlet使用的數(shù)據(jù)傳輸格式只能存儲(chǔ)結(jié)構(gòu)簡(jiǎn)單的消息數(shù)據(jù)。

        (2)客戶端只能連接一個(gè)Pushlet服務(wù)器。

        針對(duì)上述不足,本文提出使用JSON格式存儲(chǔ)服務(wù)器發(fā)送的數(shù)據(jù),在創(chuàng)建Pushlet服務(wù)器連接方面,使用OOP思想把連接封裝成類,以便多次創(chuàng)建連接對(duì)象連接多個(gè)Pushlet服務(wù)器。

        1 Pushlet的主要技術(shù)

        Pushlet是Comet的開源框架,它提供基于Ajax長(zhǎng)輪詢方式和基于iframe的流方式兩種的服務(wù)器推送實(shí)現(xiàn)[3]。整個(gè)框架涉及服務(wù)器端以及客戶端的實(shí)現(xiàn)。服務(wù)器端采用Servlet技術(shù)監(jiān)聽客戶端請(qǐng)求,客戶端采用JavaScript技術(shù)并實(shí)現(xiàn)跨瀏覽器實(shí)現(xiàn)。Pushlet服務(wù)器端框架和客戶端框架基于 Pushlet協(xié)議,協(xié)議示意圖分別如圖1、圖 2所示。

        圖1 Ajax長(zhǎng)輪詢模式的Pushlet交互協(xié)議

        圖2 streaming模式的Pushlet交互協(xié)議

        Pushlet協(xié)議[4]組成:

        (1)會(huì)話管理:客戶端發(fā)送 “join”請(qǐng)求建立一個(gè)Pushlet會(huì)話,以后服務(wù)器通過這個(gè)會(huì)話管理該客戶端的所有請(qǐng)求??蛻舳税l(fā)送“l(fā)isten”請(qǐng)求來監(jiān)聽并準(zhǔn)備接收服務(wù)器端的數(shù)據(jù)。Pushlet還提供了一個(gè)快捷請(qǐng)求“joinlisten”合并這兩步請(qǐng)求??蛻舳税l(fā)送的“l(fā)eave”請(qǐng)求用來斷開會(huì)話。

        (2)主題訂閱:客戶端通過“subscribe”請(qǐng)求向服務(wù)器訂閱一個(gè)或多個(gè)主題,告訴服務(wù)器如果這個(gè)主題的狀態(tài)發(fā)生改變了就告訴我??蛻舳艘部梢酝ㄟ^“unsubscribe”來取消一個(gè)或多個(gè)主題的訂閱。

        (3)消息發(fā)布:客戶端可以通過發(fā)送“publish”請(qǐng)求讓服務(wù)器廣播或多播它的消息。

        (4)數(shù)據(jù)推送:服務(wù)端通過發(fā)送“data”消息向客戶端推送數(shù)據(jù)。

        (5)心跳消息:在連接快超時(shí)時(shí),服務(wù)器向發(fā)送“heartbeat”消息說明會(huì)話還存活,以防瀏覽器請(qǐng)求超時(shí)。

        (6)刷新消息:在 Ajax長(zhǎng)輪詢的模式下,服務(wù)器每次有數(shù)據(jù)返回消息給客戶端、發(fā)送心跳信號(hào)、返回listen-ack時(shí),都必須再發(fā)送一條refresh消息給客戶端,告訴客戶端在多長(zhǎng)時(shí)間后發(fā)送“refresh”請(qǐng)求重新建立連接以保持長(zhǎng)Http連接。

        為加強(qiáng)協(xié)議的可靠性,客戶端向服務(wù)器端發(fā)送的控制請(qǐng)求,服務(wù)器都會(huì)返回相應(yīng)的ack消息。Pushlet靠?jī)蓷lHttp連接與服務(wù)器交互:一條是專門發(fā)送控制請(qǐng)求;另外一條則是專門接收數(shù)據(jù)的長(zhǎng)連接,這個(gè)長(zhǎng)連接是以“l(fā)isten”請(qǐng)求開始的。

        Pushlet整體框架如圖3所示[5]。

        圖3 Pushlet整體框架圖

        2 Pushlet框架的不足與改進(jìn)

        2.1 數(shù)據(jù)傳輸格式的不足與改進(jìn)

        Pushlet框架中基于Ajax長(zhǎng)輪詢的客戶端框架從服務(wù)器端獲得的是XML格式的數(shù)據(jù),其格式是<event消息字段="字段值".../>,具體示例如下:

        Pushlet雖然使用了具有強(qiáng)大數(shù)據(jù)描述能力的XML來存儲(chǔ)推送的數(shù)據(jù),可是它只是簡(jiǎn)單地利用元素的屬性來存儲(chǔ)鍵/值對(duì)格式的消息數(shù)據(jù),類似HTTP GET請(qǐng)求的 QueryString, 如 :p_event=join-listen-ack&p_mode=pull&p_time=1321791777&p_id=qegagopapu。 這種 鍵/值 對(duì)的數(shù)據(jù)格式只能存儲(chǔ)簡(jiǎn)單信息,不易存儲(chǔ)額外的復(fù)雜數(shù)據(jù)。如上述例子中從服務(wù)器獲得的數(shù)據(jù)相當(dāng)于服務(wù)器使用XML格式傳送Pushlet協(xié)議的頭部信息,而復(fù)雜的實(shí)際數(shù)據(jù)很難使用這種鍵/值的格式存儲(chǔ)。

        對(duì)于上述Pushlet的局限性,可以使用JSON進(jìn)行數(shù)據(jù)傳輸。按照Ajax的定義,原則上應(yīng)該采用傳統(tǒng)的XML數(shù)據(jù)傳輸格式??墒荴ML是一種結(jié)構(gòu)化的文檔,在服務(wù)器和客戶端均需要進(jìn)行手工解析[6]。這種方案不僅存在解析時(shí)的復(fù)雜性問題,而且對(duì)于不同瀏覽器存在兼容性問題。此外,XML使用的標(biāo)簽會(huì)產(chǎn)生大量的數(shù)據(jù)冗余減低數(shù)據(jù)傳輸效率。相對(duì)地JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,它是JavaScript規(guī)范的子集,本質(zhì)上就是JavaScript的復(fù)合對(duì)象。所以JSON易于被瀏覽器解析和生成,也可以表示非常復(fù)雜的數(shù)據(jù)。故本文選擇JSON作為數(shù)據(jù)傳輸格式,把服務(wù)器傳送的數(shù)據(jù)使用JSON格式傳輸,具體如下:

        2.2 客戶端框架的不足與改進(jìn)

        基于Ajax長(zhǎng)輪詢的Pushlet客戶端框架還有一個(gè)局限就是一個(gè)客戶端只能和一個(gè)Pushlet服務(wù)交互。這個(gè)客戶端框架使用JavaScript函數(shù)式編程,只能定義Window的一個(gè)全局變量建立一個(gè)會(huì)話與Pushlet服務(wù)端交互。為使客戶端可以創(chuàng)建多個(gè)會(huì)話與多個(gè)Pushlet服務(wù)端交互,本文使用面向?qū)ο蠓椒ǚ庋b已有的框架創(chuàng)建會(huì)話類,這樣就可以定義多個(gè)會(huì)話對(duì)象創(chuàng)建多個(gè)連接。

        改進(jìn)后客戶端框架中各個(gè)類實(shí)例之間的交互如圖4所示。

        (1)Session: 會(huì) 話 管 理 類 , 包 含 Pushlet服 務(wù) 端 的URI、會(huì)話ID、會(huì)話狀態(tài)。用戶可以通過Session對(duì)象進(jìn)行命令請(qǐng)求。對(duì)于接收到消息后的處理函數(shù),則可以通過配置對(duì)象在創(chuàng)建Session實(shí)例時(shí)指定。

        (2)Check:狀態(tài)驗(yàn)證類,驗(yàn)證當(dāng)前會(huì)話狀態(tài)保證正確的協(xié)議時(shí)序。

        (3)Control:消息路由類,根據(jù)接收到消息分發(fā)給相應(yīng)的消息處理函數(shù)。

        (4)Ajax:異步通信類,封裝 Ajax功能直接與服務(wù)器端通信。

        (5)PushletEvent:Pushlet事件類,負(fù)責(zé)解析事件消息和生成事件。

        圖4 改進(jìn)后的客戶端框架時(shí)序圖

        使用JSON進(jìn)行數(shù)據(jù)交互,相應(yīng)地在服務(wù)器端也需要有一個(gè)JSON數(shù)據(jù)發(fā)送器。Pushlet的服務(wù)器端框架提供了一個(gè)專門用于向客戶端發(fā)送數(shù)據(jù)的ClientAdapter接口,這個(gè)JSON數(shù)據(jù)發(fā)送器就必須實(shí)現(xiàn)這個(gè)ClientAdapter接口。另外還需在Command類的createClientAdapter方法中增加一個(gè)判斷來生成JSON數(shù)據(jù)發(fā)送器的實(shí)例。

        3 在Web投票系統(tǒng)中應(yīng)用

        3.1 總體描述

        以往大部分的Web投票系統(tǒng)都只是實(shí)現(xiàn)最基本的功能:發(fā)起投票和投票并評(píng)論,如QQ群社區(qū)的群投票。在有些決策性投票中,用戶希望能看到投票的實(shí)時(shí)情況。為此用戶必須時(shí)刻刷新頁面才能看到投票的最新情況。本文應(yīng)用改進(jìn)的Pushlet框架技術(shù)實(shí)現(xiàn)的Web投票系統(tǒng),是在基本的投票應(yīng)用功能上增加顯示實(shí)時(shí)投票情況的功能。

        投票Web應(yīng)用主要分5個(gè)模塊:發(fā)起投票模塊、投票查詢模塊、投票模塊、登錄/注冊(cè)模塊、網(wǎng)站狀態(tài)模塊。該應(yīng)用只有注冊(cè)用戶才可以發(fā)起投票,投票可以分為匿名投票和實(shí)名投票。投票查詢又分一般查詢、過期投票查詢、未過期投票查詢、用戶參與的投票和用戶發(fā)起的投票。投票模塊需要顯示各個(gè)候選項(xiàng)的投票比例和用戶的投票留言。網(wǎng)站狀態(tài)模塊則是顯示網(wǎng)站的基本信息,如注冊(cè)的用戶、總發(fā)起投票的個(gè)數(shù)等。本應(yīng)用的實(shí)現(xiàn)使用了SSH2框架,網(wǎng)站前臺(tái)實(shí)現(xiàn)使用Ext JS框架,服務(wù)器推送部分使用Pushlet框架。投票Web應(yīng)用的總體架構(gòu)如圖5所示。

        圖5 投票Web應(yīng)用的架構(gòu)

        3.2 部分具體實(shí)現(xiàn)

        為進(jìn)一步說明改進(jìn)的Pushlet框架技術(shù)的具體應(yīng)用,下面給出系統(tǒng)的某些部分的實(shí)現(xiàn)。系統(tǒng)的實(shí)時(shí)性需求有如下兩點(diǎn):(1)當(dāng)有用戶注冊(cè)或發(fā)起投票后,該應(yīng)用的基本信息就會(huì)改變,這時(shí)服務(wù)器就需要推送該應(yīng)用最新的基本信息給客戶端;(2)當(dāng)用戶投票成功后,該項(xiàng)投票的候選項(xiàng)的票數(shù)比例會(huì)改變,而且也會(huì)有新的投票留言,這時(shí)服務(wù)器也需要推送該項(xiàng)投票的最新信息給客戶端。

        Pushlet通過主題來管理所有需要推送的數(shù)據(jù)。主題采用具有層次的樹形結(jié)構(gòu),上層主題包含下層主題,類似文件系統(tǒng)的目錄,如/system/time、/system/tem 就 表 示兩個(gè)主題。如果訂閱主題為“/system”,則表示同時(shí)訂閱了/system下的所有子主題 (/system/time和/system/tem);如果訂閱主題為“/”的根主題,則表示訂閱了服務(wù)器里所有的主題。

        該應(yīng)用中主要有兩個(gè)大主題:網(wǎng)站最新基本信息和投票最新信息,分別用“/vote/basic”和“/vote/info”表示主題。網(wǎng)站基本信息包括多個(gè)項(xiàng)目,如用戶注冊(cè)人數(shù)、發(fā)起投票總個(gè)數(shù)等,這些信息按項(xiàng)目名稱劃分主題:“/vote/basic/項(xiàng)目名稱”。用戶可能同時(shí)進(jìn)行多項(xiàng)投票,投票最新信息按照投票 ID劃分主題:“/vote/info/投票 ID”。每個(gè)客戶端都必須訂閱“/vote/basic”主題,在打開一個(gè)投票表單時(shí)需要訂閱“/vote/info/該投票ID”主題。

        圖6是客戶端與服務(wù)器直接交互的具體情況。當(dāng)有新用戶注冊(cè)時(shí),服務(wù)器會(huì)向其他客戶端推送網(wǎng)站的注冊(cè)用戶數(shù)的基本信息。當(dāng)有用戶確定投票時(shí),服務(wù)器也會(huì)推送投票的最新情況。

        該應(yīng)用的客戶端是基于Ext JS框架并使用經(jīng)典的MVC模式和命名空間來組織代碼。Ext控件的配置和布局放在視圖包,Ext的事件處理函數(shù)和Pushlet客戶端框架放在控制包,Ext控件的Store和數(shù)據(jù)模型Model放在數(shù)據(jù)模型包。為與Ext異步調(diào)用的技術(shù)一致,Pushlet框架的客戶端選用基于Ajax長(zhǎng)輪詢的方式。這里使用JSON數(shù)據(jù)方式傳送,引用的框架庫文件是改進(jìn)后的框架庫文件。該應(yīng)用的服務(wù)器端則需要在調(diào)用相關(guān)邏輯層服務(wù)后調(diào)用Pushlet的分發(fā)函數(shù),向客戶端推送數(shù)據(jù)。具體服務(wù)器端組件間的交互如圖7所示。

        圖6 客戶端與服務(wù)器的交互

        圖7 服務(wù)器端各組件之間的交互

        Pushlet框架在該應(yīng)用中的集成步驟如下:

        (1) 把 pushlet.jar復(fù)制到 WebRootWEB-INFlib下,并添加進(jìn)classpath。

        (2)把pushlet.properties和sources.properties復(fù)制到WebRootWEB-INF下。pushlet.properties是Pushlet的配置文件,本應(yīng)用中沒有用到數(shù)據(jù)源,需要把sources.activate的值設(shè)為false。

        (3)把Pushlet改進(jìn)后的客戶端框架的文件Ajax-pus hlet-client-json.js復(fù)制到WebRoot下的一個(gè)lib文件中。

        本文對(duì)Pushlet框架的一些不足做了改進(jìn)。但是Pushlet的實(shí)現(xiàn)方式使服務(wù)器必須維護(hù)很多連接,因此對(duì)服務(wù)器性能要求很高。對(duì)此服務(wù)器可以選擇經(jīng)過性能改進(jìn)的Jetty服務(wù)器。Pushlet這種長(zhǎng)連接的推技術(shù)僅適合用于中小型的應(yīng)用。本文中的投票Web應(yīng)用也是基于一定群體用戶的投票行為。

        [1]Alex Russell.Comet: low latency data for the browser[EB/OL].[2006-06].http://alex.dojotoolkit.org/?p=545.

        [2]孫清國,朱瑋,劉華軍,等.Web應(yīng)用中的服務(wù)器推送技術(shù)研究綜述[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008(11):116-120.

        [3]陳航,趙方.基于服務(wù)器推送技術(shù)和XMPP的Web IM系統(tǒng)實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(5):925-928.

        [4]BROECKE J V D.Pushlets-protocol specification[EB/OL].[2006-05-25].http://www.pushlets.com/doc/protocol-all.html.

        [5]yxw246.Pushlet 2.0.3源碼分析 (服務(wù)器端)[EB/OL].[2008-05-08].http://blog.csdn.net/yxw246/article/details/2418255.

        [6]張濤,黃強(qiáng),毛磊雅,等.一個(gè)基于 JSON的對(duì)象序列化算法[J].計(jì)算機(jī)工程與應(yīng)用,2007,43(15):98-100.

        猜你喜歡
        服務(wù)器端消息客戶端
        一張圖看5G消息
        縣級(jí)臺(tái)在突發(fā)事件報(bào)道中如何應(yīng)用手機(jī)客戶端
        孵化垂直頻道:新聞客戶端新策略
        基于Vanconnect的智能家居瘦客戶端的設(shè)計(jì)與實(shí)現(xiàn)
        淺析異步通信層的架構(gòu)在ASP.NET 程序中的應(yīng)用
        成功(2018年10期)2018-03-26 02:56:14
        在Windows中安裝OpenVPN
        消息
        消息
        消息
        客戶端空間數(shù)據(jù)緩存策略
        日韩亚洲精选一区二区三区| 香蕉人妻av久久久久天天| 精品无码久久久九九九AV| 一级一片内射在线播放| 日本视频一区二区三区一| 天天躁夜夜躁天干天干2020| 麻豆成人在线视频| 国产精品人人爱一区二区白浆| 久久精品熟女亚洲av麻豆永永| 国产精品久久久久久久| 在线观看免费a∨网站| 少妇av免费在线播放| 久草手机视频在线观看| 玩中年熟妇让你爽视频| 青青操国产在线| 日韩av在线不卡一二三区| 草逼短视频免费看m3u8| 无码ol丝袜高跟秘书在线观看| 把女的下面扒开添视频| 亚洲av日韩av无码av| 无码电影在线观看一区二区三区| 中国少妇和黑人做爰视频| 久久女人精品天堂av影院麻| 337p日本欧洲亚洲大胆精品| 色丁香久久| 久久综合给合久久狠狠狠9| 国产精品久久av高潮呻吟| 一本加勒比hezyo无码专区| 女同久久精品国产99国产精品| 中文字幕亚洲区第一页| 国产精品国产av一区二区三区| 最新亚洲人成网站在线观看| 国产高潮精品久久AV无码 | 亚洲欧美日韩高清专区一区| 国产大陆av一区二区三区| 精品久久亚洲中文字幕| 国产一区二区在线视频 | 国产70老熟女重口小伙子| 欧美日韩国产高清| 国产一区二区三区视频地址| 亚洲女初尝黑人巨高清|