專利名稱:一種保持連接的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信領(lǐng)域,特別涉及一種保持連接的方法及裝置。
技術(shù)背景
http (Hypertext Transfer Protocol,超文本傳輸協(xié)議)是超文本轉(zhuǎn)移協(xié)議,是客 戶端瀏覽器或其他程序與Web (環(huán)球網(wǎng))服務(wù)器之間的應(yīng)用層通信協(xié)議。http中本身只有 短連接的方式,傳輸過程主要是請求數(shù)據(jù)-建立連接-發(fā)送響應(yīng)-關(guān)閉連接,在請求響應(yīng) 結(jié)束后立即關(guān)閉連接,如需新的請求必須重新建立連接。由于建立http請求的連接需要一 定的時間,這樣一來實(shí)時性就會降低,不適應(yīng)于對實(shí)時性要求較高的系統(tǒng),如監(jiān)控系統(tǒng),且 對服務(wù)器的負(fù)載也會造成較大影響。
針對http短連接的弊端,現(xiàn)有技術(shù)中提出了一些建立http長連接的方式,所謂長 連接,指在一個連接上可以連續(xù)發(fā)送多個數(shù)據(jù)包,然后斷開連接。其中主要技術(shù)包括
AJAX (Asynchronous JavaScript and XML, JavaScript ( —ft 腳本語言)和XML(Extensible Markup Language,可擴(kuò)展標(biāo)記語言))技術(shù),客戶端通過不 間斷的短連接來構(gòu)成了長連接。此方案雖然較為簡單,但服務(wù)器端需要處理大量的http請 求,給服務(wù)器端造成太大的負(fù)荷,且客戶端也需要不斷發(fā)送請求,負(fù)荷也不小。
方式二 利用Flash(交互式矢量圖和Web動畫的標(biāo)準(zhǔn))提供的XMLSocket類,在 JavaScript中直接調(diào)用Flash中XMLSocket類提供的接口來實(shí)現(xiàn)http方式的長連接。其 中,F(xiàn)lash的腳本語言是ActionScript,XMLSocket是ActionScript中的一個類。此方案 的缺點(diǎn)在于,XMLSocket類只能連接到端口號大于或等于IOM的TCP端口,與XMLSocket對 象通訊的服務(wù)器程序也必須分配到端口號大于或等于IOM的端口。一般防火墻為了安全 起見,都只開80和其他一些常用的端口,因此XMLSocket類無法穿過防火墻,可能導(dǎo)致消息 發(fā)送不成功,且需要在瀏覽器中設(shè)置額外的通信接口,該接口并非瀏覽器默認(rèn),可能會受到 代理服務(wù)器的限制,并且,客戶端也需要安裝Flash插件。發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供一種保持連接的方法,用于實(shí)現(xiàn)基于http的長連接,提高了 http中數(shù)據(jù)傳輸?shù)膶?shí)時性。
—種保持連接的方法,包括以下步驟
接收連接請求并建立http連接;
根據(jù)連接請求創(chuàng)建消息隊(duì)列;
通過消息隊(duì)列等待需要傳輸?shù)氖录?,以保持連接。
一種保持連接的方法,包括以下步驟
當(dāng)需要請求數(shù)據(jù)時,發(fā)送連接請求;
接收確認(rèn)建立連接的響應(yīng)消息,并根據(jù)響應(yīng)消息確認(rèn)建立http連接;
確認(rèn)建立連接后發(fā)送業(yè)務(wù)請求,以獲取數(shù)據(jù)。
一種保持連接的裝置,應(yīng)用于網(wǎng)絡(luò)側(cè),包括
收發(fā)模塊,用于接收連接請求;
創(chuàng)建模塊,用于建立http連接,及根據(jù)連接請求創(chuàng)建消息隊(duì)列;
分發(fā)模塊,用于通過所述消息隊(duì)列等待需要傳輸?shù)氖录?,以保持連接。
一種保持連接的裝置,應(yīng)用于客戶端,包括
收發(fā)模塊,用于當(dāng)需要請求數(shù)據(jù)時,發(fā)送連接請求,接收確認(rèn)建立連接的響應(yīng)消 息,及發(fā)送業(yè)務(wù)請求,以獲取數(shù)據(jù);
處理模塊,用于確認(rèn)建立http連接。
本發(fā)明實(shí)施例中接收連接請求并建立http連接;根據(jù)連接請求創(chuàng)建消息隊(duì)列;通 過消息隊(duì)列等待需要傳輸?shù)臄?shù)據(jù),以保持連接。在現(xiàn)有技術(shù)中,有待發(fā)送數(shù)據(jù)時才會有發(fā)送 隊(duì)列,該隊(duì)列只起緩存數(shù)據(jù)的作用,因此無法長期保持連接,而在本發(fā)明實(shí)施例中,消息隊(duì) 列是與連接相對應(yīng),只要建立連接即創(chuàng)建該連接的消息隊(duì)列,該消息隊(duì)列不是因數(shù)據(jù)的存 在而存在,從而建立了基于http的長連接,提高了 http中數(shù)據(jù)傳輸?shù)膶?shí)時性。
圖1為本發(fā)明實(shí)施例中保持連接的系統(tǒng)的主要結(jié)構(gòu)圖2A為本發(fā)明實(shí)施例中網(wǎng)絡(luò)側(cè)保持連接的裝置的主要結(jié)構(gòu)圖2B為本發(fā)明實(shí)施例中網(wǎng)絡(luò)側(cè)保持連接的裝置的詳細(xì)結(jié)構(gòu)圖2C為本發(fā)明實(shí)施例中在網(wǎng)絡(luò)側(cè)包括初始化模塊及驗(yàn)證模塊的保持連接的裝置 的詳細(xì)結(jié)構(gòu)圖3為本發(fā)明實(shí)施例中客戶端保持連接的裝置的主要結(jié)構(gòu)圖4為本發(fā)明實(shí)施例中網(wǎng)絡(luò)側(cè)保持連接的方法的主要流程圖5為本發(fā)明實(shí)施例中客戶端保持連接的方法的主要流程圖6為本發(fā)明實(shí)施例中網(wǎng)絡(luò)側(cè)保持連接的方法的詳細(xì)流程圖7為本發(fā)明實(shí)施例中通過分發(fā)模塊訪問消息隊(duì)列來獲知是否有可提取的事件 時網(wǎng)絡(luò)側(cè)保持連接地方法的詳細(xì)流程圖8為本發(fā)明實(shí)施例中獲取數(shù)據(jù)的詳細(xì)方法流程圖。
具體實(shí)施方式
本發(fā)明實(shí)施例中接收連接請求并建立http連接;根據(jù)連接請求創(chuàng)建消息隊(duì)列;通 過消息隊(duì)列等待需要傳輸?shù)臄?shù)據(jù),以保持連接。在現(xiàn)有技術(shù)中,有待發(fā)送數(shù)據(jù)時才會有發(fā)送 隊(duì)列,該隊(duì)列只起緩存數(shù)據(jù)的作用,因此無法長期保持連接,而在本發(fā)明實(shí)施例中,消息隊(duì) 列是與連接相對應(yīng),只要建立連接即創(chuàng)建該連接的消息隊(duì)列,該消息隊(duì)列不是因數(shù)據(jù)的存 在而存在,從而建立了基于http的長連接,提高了 http中數(shù)據(jù)傳輸?shù)膶?shí)時性。
參見圖1,本發(fā)明實(shí)施例中保持連接的系統(tǒng)包括服務(wù)器100和客戶端200。
服務(wù)器100用于接收連接請求并建立http連接;根據(jù)連接請求創(chuàng)建消息隊(duì)列;通 過消息隊(duì)列等待需要傳輸?shù)臄?shù)據(jù),以保持連接。接收連接請求,對該請求進(jìn)行處理,及發(fā)送 確認(rèn)建立連接的響應(yīng)事件。其中,服務(wù)器100中包括收發(fā)模塊、消息隊(duì)列、分發(fā)模塊、執(zhí)行 模塊、構(gòu)造模塊、初始化模塊及驗(yàn)證模塊。收發(fā)模塊接收客戶端200發(fā)送的連接請求,創(chuàng)建模塊根據(jù)該連接請求創(chuàng)建一個執(zhí)行模塊,執(zhí)行模塊根據(jù)該請求構(gòu)造建立連接的Event (事 件),創(chuàng)建模塊還要根據(jù)該接收的請求的類型確定該創(chuàng)建的執(zhí)行模塊處理需要傳輸?shù)氖录?類型,以創(chuàng)建對應(yīng)的瀏覽器適配器,并通過瀏覽器適配器向該客戶端200發(fā)送事件。構(gòu)造 模塊根據(jù)創(chuàng)建的執(zhí)行模塊中包含的信息構(gòu)造Command (命令)對象,及通過執(zhí)行該Command 對象構(gòu)造建立請求的響應(yīng)事件rspEvent,構(gòu)造模塊還用于將所請求的數(shù)據(jù)封裝成事件,放 入消息隊(duì)列,分發(fā)模塊從消息隊(duì)列中提取待發(fā)送的事件,傳遞給收發(fā)模塊,由收發(fā)模塊中的 瀏覽器適配器向客戶端200發(fā)送rspEvent及所請求的數(shù)據(jù),其中,該數(shù)據(jù)是封裝在事件中 發(fā)送給客戶端200的。初始化模塊還要在處理請求之前進(jìn)行初始化,及驗(yàn)證模塊在無封裝 成事件的數(shù)據(jù)傳輸時可以向客戶端200發(fā)送心跳事件,以使客戶端200獲知服務(wù)器100工 作正常。當(dāng)瀏覽器關(guān)閉時,向服務(wù)器100發(fā)送退出請求,服務(wù)器100接收到該請求后連接關(guān) 閉;或者消息隊(duì)列中可以有一個定時器,當(dāng)定時器超時后消息隊(duì)列還未收到事件,則關(guān)閉本 次連接;或者執(zhí)行模塊在接收業(yè)務(wù)請求后可以判斷出所接收的業(yè)務(wù)請求的類型,如果為特 殊請求,則保持連接,如果為非特殊請求,則在收發(fā)模塊向客戶端200發(fā)送完其所請求的數(shù) 據(jù)后即可關(guān)閉連接,這樣以節(jié)約網(wǎng)絡(luò)資源。
客戶端200用于當(dāng)需要請求數(shù)據(jù)時,發(fā)送連接請求;接收確認(rèn)建立連接的響應(yīng)消 息,并根據(jù)響應(yīng)消息確認(rèn)建立http連接;確認(rèn)建立連接后發(fā)送用于業(yè)務(wù)請求,以獲取數(shù)據(jù)。 客戶端200向服務(wù)器100發(fā)送連接請求,在接收到服務(wù)器100返回的rspEvent后,客戶端 200確認(rèn)建立連接,則向服務(wù)器100發(fā)送業(yè)務(wù)請求,以獲取數(shù)據(jù),服務(wù)器100根據(jù)該請求進(jìn) 行處理及向客戶端200發(fā)送所請求的數(shù)據(jù),當(dāng)客戶端200收到所請求的數(shù)據(jù)后,負(fù)責(zé)處理并 更新數(shù)據(jù),利用javascript (java腳本)和AJAX技術(shù)對頁面信息進(jìn)行更新。當(dāng)瀏覽器關(guān)閉 時,還要向服務(wù)器100發(fā)送退出請求,服務(wù)器100收到該退出請求后,關(guān)閉連接。
參見圖2A,本發(fā)明實(shí)施例中保持連接的裝置包括收發(fā)模塊101、創(chuàng)建模塊102、消 息隊(duì)列103和分發(fā)模塊104。該裝置可以是服務(wù)器等網(wǎng)絡(luò)側(cè)設(shè)備。
收發(fā)模塊101用于接收請求及向客戶端200發(fā)送建立連接的響應(yīng)事件rspEvent 及所請求的數(shù)據(jù)。收發(fā)模塊101用于接收客戶端200發(fā)送的連接請求及其它用于獲取數(shù)據(jù) 的請求(也就是業(yè)務(wù)請求),通過收發(fā)模塊101中的瀏覽器適配器向該客戶端200中的瀏覽 器發(fā)送rspEvent及所請求的數(shù)據(jù),其中,該所請求的數(shù)據(jù)是以封裝成事件的形式發(fā)送。其 中,該rspEvent中可以攜帶執(zhí)行模塊105所對應(yīng)的ID。其中,瀏覽器適配器是創(chuàng)建模塊102 在創(chuàng)建執(zhí)行模塊105后創(chuàng)建的,一個瀏覽器適配器只能發(fā)送一種類型的業(yè)務(wù)請求所對應(yīng)的 事件。
創(chuàng)建模塊102用于確認(rèn)建立http連接及創(chuàng)建模塊。創(chuàng)建模塊102用于根據(jù)接收 的連接請求確認(rèn)建立連接,并創(chuàng)建執(zhí)行模塊105、消息隊(duì)列103和分發(fā)模塊104。創(chuàng)建模塊 102還用于根據(jù)接收的連接請求創(chuàng)建瀏覽器適配器,該瀏覽器適配器創(chuàng)建后定義在收發(fā)模 塊101中。
消息隊(duì)列103用于存放待發(fā)送的事件。其中,消息隊(duì)列103是創(chuàng)建模塊102在創(chuàng) 建執(zhí)行模塊105后創(chuàng)建的。其中,消息隊(duì)列103接收到的待發(fā)送的數(shù)據(jù)是已經(jīng)封裝成事件 的數(shù)據(jù),實(shí)行先入先出、后入后出的發(fā)送原則,傳遞給分發(fā)模塊104。當(dāng)分發(fā)模塊104到消息 隊(duì)列103中取事件時,若消息隊(duì)列103中沒有事件,則可以將分發(fā)模塊104的狀態(tài)設(shè)置為等 待狀態(tài),當(dāng)消息隊(duì)列103中有事件時,將分發(fā)模塊104的狀態(tài)設(shè)置為工作狀態(tài),并觸發(fā)分發(fā)6模塊104將該事件提取出來,提取完畢后繼續(xù)將分發(fā)模塊104的狀態(tài)設(shè)置為等待狀態(tài)?;?者若消息隊(duì)列103中沒有事件,分發(fā)模塊104可以不斷訪問消息隊(duì)列103,以詢問的方式獲 知消息隊(duì)列103中是否放入了事件,當(dāng)消息隊(duì)列103中放入事件后,分發(fā)模塊104將其提取 出來并傳遞給收發(fā)模塊101,傳遞完畢后繼續(xù)不斷訪問消息隊(duì)列103,以提取其中的事件, 如此循環(huán)執(zhí)行。這樣就使連接一直不會關(guān)閉,實(shí)現(xiàn)了長連接。消息隊(duì)列103還可以用于決 定是否關(guān)閉連接。消息隊(duì)列103中可以有一個定時器,當(dāng)定時器超時后消息隊(duì)列103還未 收到事件,則關(guān)閉本次連接。這樣以節(jié)約網(wǎng)絡(luò)資源。
分發(fā)模塊104用于從消息隊(duì)列103中提取待發(fā)送的事件。較佳的,分發(fā)模塊104 可以具體為事件分發(fā)器Subscriber,是創(chuàng)建模塊102在創(chuàng)建執(zhí)行模塊105后創(chuàng)建的。分發(fā) 模塊104從消息隊(duì)列103中提取出待發(fā)送的事件,再傳遞給收發(fā)模塊101,由收發(fā)模塊101 中的瀏覽器適配器進(jìn)行發(fā)送。其中,一個分發(fā)模塊104對應(yīng)于一個消息隊(duì)列103,無論一個 消息隊(duì)列103中有多少事件,都由一個分發(fā)模塊104來進(jìn)行提取。
參見圖2B,所述裝置還可以包括執(zhí)行模塊105及構(gòu)造模塊106。
執(zhí)行模塊105用于保存信息及創(chuàng)建事件。其中,執(zhí)行模塊105是在收發(fā)模塊101 收到連接請求后,由創(chuàng)建模塊102根據(jù)該請求所創(chuàng)建的。執(zhí)行模塊105中保存了各類信息, 如所述請求的類型、該執(zhí)行模塊105的ID(標(biāo)識符)、所請求的數(shù)據(jù)類型等。執(zhí)行模塊105 根據(jù)收發(fā)模塊101收到的連接請求構(gòu)造建立連接的Event (事件),該Event中封裝了請求 的類型,設(shè)置該事件的類型為connect (連接)。執(zhí)行模塊105中還保存了自身的ID、該ID 可以為字符串形式,也可以是其它形式,用于唯一標(biāo)識執(zhí)行模塊105。在一個服務(wù)器中,執(zhí)行 模塊105可能有多個,每一個長連接都對應(yīng)一個執(zhí)行模塊105,所有的執(zhí)行模塊105都由創(chuàng) 建模塊102中的kssionManager (會話管理)單元來進(jìn)行管理,SessionManager單元為單 例模式,即一個kssionManager單元管理數(shù)個執(zhí)行模塊105。執(zhí)行模塊105還用于對http 連接進(jìn)行檢測,確定是否需要保持連接,當(dāng)需要保持連接時,控制消息隊(duì)列保持連接,當(dāng)不 需要保持連接時,控制消息隊(duì)列關(guān)閉連接。執(zhí)行模塊105根據(jù)請求的類型確定該請求所對 應(yīng)的事件類型,以使創(chuàng)建模塊102創(chuàng)建對應(yīng)的瀏覽器適配器。執(zhí)行模塊105還可以判斷出 所接收的業(yè)務(wù)請求的類型,根據(jù)所接受的業(yè)務(wù)請求的類型檢測是否需要保持連接,及控制 連接何時需要中斷。并將所述業(yè)務(wù)請求的類型告知消息隊(duì)列103,如果為特殊請求,則控制 消息隊(duì)列103保持連接;如果為非特殊請求,則在向客戶端200發(fā)送完其所請求的數(shù)據(jù)后即 可控制消息隊(duì)列103關(guān)閉連接,例如,可以在所請求的事件發(fā)送完畢后消息隊(duì)列103將分發(fā) 模塊104的狀態(tài)設(shè)置為停止?fàn)顟B(tài),分發(fā)模塊104不必繼續(xù)等待從消息隊(duì)列103中提取事件, 相當(dāng)于連接關(guān)閉?;蛘撸瑘?zhí)行模塊105判斷出所接收的業(yè)務(wù)請求的類型,當(dāng)所述業(yè)務(wù)請求為 特殊業(yè)務(wù)時,向消息隊(duì)列103發(fā)送保持連接的消息,當(dāng)所述業(yè)務(wù)請求為非特殊業(yè)務(wù)時,向消 息隊(duì)列103發(fā)送關(guān)閉連接的消息,消息隊(duì)列103根據(jù)執(zhí)行模塊105發(fā)送的消息進(jìn)行相應(yīng)操 作。其中,本發(fā)明實(shí)施例中特殊請求是指所請求獲取的數(shù)據(jù)需要實(shí)時更新的請求,非特殊請 求是指所請求獲取的數(shù)據(jù)不需要實(shí)時更新的請求,只需獲取一次數(shù)據(jù)即可。
構(gòu)造模塊106用于構(gòu)造Command(命令)對象,以及通過執(zhí)行Command對象構(gòu)造 rspEvent。構(gòu)造模塊106根據(jù)執(zhí)行模塊105中包含的請求的類型構(gòu)造Command對象,其中, 該Command對象定義在構(gòu)造模塊106中的Controller (命令執(zhí)行器)中,命令執(zhí)行器用于 執(zhí)行該Command對象,以構(gòu)造rspEvent。較佳的,該rspEvent中包括執(zhí)行模塊105的ID和所請求的事件類型等信息。構(gòu)造模塊106還用于根據(jù)請求激活生產(chǎn)數(shù)據(jù)的線程,從中獲取 所請求的數(shù)據(jù),并將其封裝成事件,放入消息隊(duì)列103中。當(dāng)構(gòu)造模塊向該消息隊(duì)列103中 放入所請求的事件時,若消息隊(duì)列103中存放的事件已滿,則消息隊(duì)列103可以將構(gòu)造模塊 106的狀態(tài)設(shè)置為等待狀態(tài),當(dāng)消息隊(duì)列103中有存放空間時,將構(gòu)造模塊106的狀態(tài)設(shè)置 為工作狀態(tài),并觸發(fā)構(gòu)造模塊106向其中放入事件,放入事件完畢后再將構(gòu)造模塊106的狀 態(tài)設(shè)置為等待狀態(tài),或者若消息隊(duì)列103中沒有存放空間,構(gòu)造模塊106可以不斷訪問消息 隊(duì)列103,以詢問的方式獲知消息隊(duì)列103中是否可以放入事件。
參見圖2C,所述裝置還可以包括初始化模塊107和驗(yàn)證模塊108。
初始化模塊107用于初始化創(chuàng)建模塊102。初始化模塊107可以在接收到連接請 求后開始初始化創(chuàng)建模塊102,以開始處理該請求,或者初始化模塊107也可以在未接到請 求時初始化創(chuàng)建模塊102、分發(fā)模塊104及執(zhí)行模塊105,其中對創(chuàng)建模塊102的初始化過 程是指通過一個定時器開始對它所管理的執(zhí)行模塊105進(jìn)行檢測,包括檢測執(zhí)行模塊105 是否設(shè)置超時,是否有效,是否需要刪除等,以準(zhǔn)備接收請求。
驗(yàn)證模塊108用于將心跳事件放入消息隊(duì)列103。當(dāng)消息隊(duì)列103中沒有數(shù)據(jù)封裝 成的事件傳輸時,驗(yàn)證模塊108用于向消息隊(duì)列103中添加心跳事件,由收發(fā)模塊101中的 瀏覽器適配器發(fā)送給客戶端200,該心跳事件可以周期性添加并發(fā)送,用于告知客戶端200 服務(wù)器100工作正常,如果客戶端200收到了心跳事件,則表明服務(wù)器100運(yùn)行正常,如果 客戶端200在沒收到數(shù)據(jù)時也沒收到心跳事件,則獲知服務(wù)器100可能出現(xiàn)了故障。
參見圖3,本發(fā)明實(shí)施例中保持連接的系統(tǒng)中的客戶端200包括收發(fā)模塊201和處 理模塊202。
收發(fā)模塊201用于發(fā)送請求及接收響應(yīng)。收發(fā)模塊201用于當(dāng)需要請求獲取數(shù)據(jù) 時,向服務(wù)器100發(fā)送連接請求,及接收服務(wù)器100返回的rspEvent。其中,該rspEvent 中可以攜帶服務(wù)器100中執(zhí)行模塊105的ID。當(dāng)確認(rèn)建立連接后,收發(fā)模塊201向服務(wù)器 100發(fā)送業(yè)務(wù)請求,以獲取數(shù)據(jù),服務(wù)器100根據(jù)該請求進(jìn)行處理及向收發(fā)模塊201發(fā)送所 請求的數(shù)據(jù)。當(dāng)瀏覽器關(guān)閉時,收發(fā)模塊201還用于向服務(wù)器100發(fā)送退出請求。其中,一 個長連接支持一種類型的業(yè)務(wù)請求,因此只能傳輸此類業(yè)務(wù)請求所對應(yīng)的數(shù)據(jù)。如果瀏覽 器需要發(fā)送其它類型的業(yè)務(wù)請求,則需要再建立新的長連接來發(fā)送,一個瀏覽器上可以建 立多個長連接,類似的,瀏覽器需要發(fā)送幾種類型的業(yè)務(wù)請求,則也需建立與需要發(fā)送的業(yè) 務(wù)請求類型數(shù)目對應(yīng)的長連接。其中,業(yè)務(wù)請求是指用于獲取數(shù)據(jù)的請求。
處理模塊202用于確認(rèn)建立連接。處理模塊202當(dāng)收發(fā)模塊201收到rspEvent 后,確認(rèn)建立連接。及當(dāng)收發(fā)模塊201收到所請求的數(shù)據(jù)后,處理模塊202負(fù)責(zé)處理并更新 數(shù)據(jù)。其中,當(dāng)一個連接建立之后,服務(wù)器100若有更新的該類型的數(shù)據(jù),則會自動發(fā)送給 客戶端200,而無需客戶端200再發(fā)送獲取該類型數(shù)據(jù)的請求。其中,該處理模塊202可以 使用javascript腳本來完成。
下面通過實(shí)現(xiàn)流程來介紹保持連接的方法。
參見圖4,本發(fā)明實(shí)施例中服務(wù)器100端保持連接的方法的主要方法流程如下
步驟401 接收連接請求并建立連接。
其中,執(zhí)行模塊105在收發(fā)模塊101收到連接請求后,根據(jù)該請求構(gòu)造建立連接的 Event (事件),該Event中封裝了消息的類型,設(shè)置該事件的類型為connect (連接)。
步驟402 根據(jù)連接請求創(chuàng)建消息隊(duì)列103。
步驟403 通過消息隊(duì)列103等待需要傳輸?shù)氖录?,以保持連接。
參見圖5,本發(fā)明實(shí)施例中客戶端200保持連接的方法的主要方法流程如下
步驟501 當(dāng)需要請求數(shù)據(jù)時,發(fā)送連接請求。
步驟502 接收確認(rèn)建立連接的響應(yīng)事件,確認(rèn)建立連接。其中,在本發(fā)明實(shí)施例 中,該事件可以是rspEvent。
步驟503 發(fā)送用于獲取數(shù)據(jù)的請求,以獲取數(shù)據(jù)。
以上是保持連接的方法在服務(wù)器100端及客戶端200的主要方法流程,以下通過 幾個具體的實(shí)施例來詳細(xì)介紹保持連接的方法。
參見圖6,本發(fā)明實(shí)施例中服務(wù)器100端保持連接的方法的詳細(xì)方法流程如下
步驟601 接收連接請求并建立連接。
步驟602 根據(jù)接收的連接請求創(chuàng)建執(zhí)行模塊105。其中,執(zhí)行模塊105中保存了 請求的類型及執(zhí)行模塊105的ID等信息。
步驟603:根據(jù)接收的連接請求構(gòu)造建立連接的事件Event。其中,是執(zhí)行模塊105 構(gòu)造該建立連接的事件,該Event中封裝了請求的類型,設(shè)置該事件的類型為connect (連 接)。
步驟604 根據(jù)構(gòu)造的建立連接的事件創(chuàng)建消息隊(duì)列103。還需創(chuàng)建分發(fā)模塊104 及收發(fā)模塊101中的瀏覽器適配器。
步驟605 判斷消息隊(duì)列103中是否有可提取的事件。當(dāng)判斷結(jié)果為是時,繼續(xù)步 驟606,否則繼續(xù)步驟607。
步驟606 從消息隊(duì)列103中提取事件。繼續(xù)步驟607。
步驟607 將分發(fā)模塊104的狀態(tài)設(shè)為等待狀態(tài)。
當(dāng)有事件存入消息隊(duì)列103時,繼續(xù)步驟608。
步驟608 觸發(fā)分發(fā)模塊104提取事件。當(dāng)消息隊(duì)列103中有可提取的事件時,將 分發(fā)模塊104的狀態(tài)設(shè)置為工作狀態(tài),并觸發(fā)分發(fā)模塊104提取事件。當(dāng)分發(fā)模塊104提 取事件完畢后,將分發(fā)模塊104的狀態(tài)設(shè)置為等待狀態(tài),繼續(xù)等待提取事件。
步驟609 根據(jù)請求的類型構(gòu)造Command對象。其中,該Command對象定義在 Controller中,該Command對象中包含了瀏覽器適配器的信息。
步驟610 通過執(zhí)行Command對象構(gòu)造rspEvent。其中,該rspEvent表示確認(rèn)建 立連接的響應(yīng)消息,其中包括執(zhí)行模塊105的ID和所請求的類型等信息。
步驟611 向客戶端200發(fā)送rspEvent,確認(rèn)建立連接。其中,是收發(fā)模塊101中 的瀏覽器適配器向客戶端200發(fā)送rspEvent。
參見圖7,本發(fā)明實(shí)施例中分發(fā)模塊104通過不斷訪問消息隊(duì)列103來獲知是否有 可提取的事件。詳細(xì)方法流程如下
步驟701 接收連接請求并建立連接。
步驟702 根據(jù)接收的連接請求創(chuàng)建執(zhí)行模塊105。其中,執(zhí)行模塊105中保存了 請求的類型及執(zhí)行模塊105的身份ID等信息。
步驟703 根據(jù)接收的連接請求構(gòu)造建立連接的事件Event。其中,該Event中封 裝了請求的類型,設(shè)置該事件的類型為connect (連接)。
步驟704 根據(jù)建立連接的事件創(chuàng)建消息隊(duì)列103。其中還需創(chuàng)建分發(fā)模塊104及 收發(fā)模塊101中的瀏覽器適配器。
步驟705 判斷消息隊(duì)列103中是否有可提取的事件。當(dāng)判斷結(jié)果為是時,繼續(xù)步 驟706,否則繼續(xù)步驟707。
步驟706 從消息隊(duì)列103中提取事件。
步驟707 訪問消息隊(duì)列103,以獲知是否有可提取的事件。
若消息隊(duì)列103中沒有事件,分發(fā)模塊104可以不斷訪問消息隊(duì)列103,以詢問的 方式獲知消息隊(duì)列103中是否放入了事件。當(dāng)消息隊(duì)列103中有事件時,將分發(fā)模塊104 的狀態(tài)設(shè)置為工作狀態(tài),分發(fā)模塊104從消息隊(duì)列103中提取事件并傳遞給收發(fā)模塊,傳遞 完后再將分發(fā)模塊104的狀態(tài)設(shè)置為等待狀態(tài),繼續(xù)等待提取消息隊(duì)列103中的事件,如此 循環(huán)執(zhí)行,
步驟708 根據(jù)請求的類型構(gòu)造Command對象。其中,該Command對象定義在 Controller中,該Command對象中包含了瀏覽器適配器的信息。
步驟709 通過執(zhí)行Command對象構(gòu)造rspEvent。其中,該rspEvent表示已建立 連接的確認(rèn)響應(yīng)消息,其中包括執(zhí)行模塊105的ID和所請求的數(shù)據(jù)類型等信息。
步驟710 向客戶端200發(fā)送rspEvent,確認(rèn)建立連接。其中,是收發(fā)模塊101中 的瀏覽器適配器向客戶端200發(fā)送rspEvent。
參見圖8,本發(fā)明實(shí)施例中是建立連接之后,用于獲取數(shù)據(jù)的方法。較佳的,本發(fā)明 實(shí)施例中以listen(監(jiān)聽)請求為例。詳細(xì)方法流程如下
客戶端200已收到rspEvent,確認(rèn)建立連接。
步驟801 接收listen請求。該請求中攜帶ID。其中,該ID是服務(wù)器100向客戶 端發(fā)送rspEvent時其中攜帶的執(zhí)行模塊105的ID。
其中,該listen請求是一種業(yè)務(wù)或數(shù)據(jù)請求,其所請求的數(shù)據(jù)需要實(shí)時更新,在 本發(fā)明實(shí)施例中將請求此類數(shù)據(jù)的請求稱為特殊請求,如果所請求的數(shù)據(jù)無需實(shí)時更新, 一次數(shù)據(jù)傳輸完畢即可,則這類請求稱為非特殊請求。
步驟802 根據(jù)接收的listen請求構(gòu)造Event。
步驟803 根據(jù)接收的listen請求中攜帶的ID確定屬于該請求的執(zhí)行模塊105。
步驟804 根據(jù)請求的類型及所請求的數(shù)據(jù)類型等信息構(gòu)造Command對象。
步驟805 根據(jù)Command對象中包含的信息構(gòu)造rsplistenEvent (確認(rèn)監(jiān)聽事 件)。其中,該rsplistenEvent是對listen請求的響應(yīng)事件。
步驟806 將執(zhí)行模塊105的ID攜帶在該rsplistenEvent中,設(shè)置 rsplistenEvent的屬性。其中,所述屬性包括傳輸格式、請求獲取的數(shù)據(jù)類型、消息類型等。
步驟807 激活消息隊(duì)列103。
步驟808 向消息隊(duì)列103中添加所請求的事件。
步驟809 判斷消息隊(duì)列中是否有可提取的事件。當(dāng)判斷結(jié)果為是時,繼續(xù)步驟 810,否則繼續(xù)步驟811。
步驟810 從消息隊(duì)列103中提取事件。
步驟811 將分發(fā)模塊104的狀態(tài)設(shè)為等待狀態(tài)。
步驟812 觸發(fā)分發(fā)模塊104提取事件。當(dāng)消息隊(duì)列103中有可提取的事件時,將分發(fā)模塊104的狀態(tài)設(shè)置為工作狀態(tài),并觸發(fā)分發(fā)模塊104提取事件。當(dāng)分發(fā)模塊104提 取事件完畢后,將分發(fā)模塊104的狀態(tài)設(shè)置為等待狀態(tài),繼續(xù)等待提取事件。
其中,需激活后臺生產(chǎn)數(shù)據(jù)的線程,從而通過構(gòu)造模塊106向消息隊(duì)列103中添加 所請求的數(shù)據(jù),并且是將所請求的數(shù)據(jù)封裝成所請求的事件后添加到消息隊(duì)列103中。
步驟813 向客戶端200發(fā)送rsplistenEvent。其中,是通過收發(fā)模塊101中的瀏 覽器適配器向客戶端200發(fā)送該rsplistenEvent,以通知客戶端200準(zhǔn)備接收數(shù)據(jù)。
步驟814 向客戶端200發(fā)送所請求的事件。其中,分發(fā)模塊104將數(shù)據(jù)傳遞給收 發(fā)模塊101中的瀏覽器適配器,由瀏覽器適配器向客戶端200發(fā)送所請求的事件。
其中,如果消息隊(duì)列103的隊(duì)列中沒有事件,表明服務(wù)器100沒有產(chǎn)生數(shù)據(jù),可以 向該隊(duì)列中添加心跳事件,發(fā)送到客戶端,客戶端以此獲知服務(wù)器100在沒有數(shù)據(jù)產(chǎn)生的 情況下工作正常。
其中,在步驟802中,服務(wù)器100在接收到業(yè)務(wù)請求后可以判斷出業(yè)務(wù)請求的類 型,如果為特殊請求,則無須關(guān)閉連接,執(zhí)行如上操作;如果為非特殊請求,則服務(wù)器100在 向客戶端200發(fā)送完其所請求的數(shù)據(jù)后即可關(guān)閉連接,例如,可以在步驟812完畢后將分發(fā) 模塊104的狀態(tài)設(shè)置為停止?fàn)顟B(tài),分發(fā)模塊104不必繼續(xù)等待從消息隊(duì)列103中提取事件, 相當(dāng)于連接關(guān)閉?;蛘?,消息隊(duì)列103中可以有一個定時器,當(dāng)定時器超時后消息隊(duì)列103 中依然沒有放入所請求的事件,則將分發(fā)模塊104的等待狀態(tài)解除,分發(fā)模塊104不再繼續(xù) 等待提取數(shù)據(jù),相當(dāng)于連接關(guān)閉。
本發(fā)明實(shí)施例中接收連接請求并建立http連接;根據(jù)連接請求創(chuàng)建消息隊(duì)列 103 ;通過消息隊(duì)列103等待需要傳輸?shù)氖录?,以保持連接。在現(xiàn)有技術(shù)中,有待發(fā)送數(shù)據(jù)時 才會有發(fā)送隊(duì)列,數(shù)據(jù)發(fā)送完畢則該隊(duì)列也不復(fù)存在,因此無法長期保持連接,而在本發(fā)明 實(shí)施例中,消息隊(duì)列103是與消息相對應(yīng),只要接收到消息即創(chuàng)建消息隊(duì)列103,該消息隊(duì) 列103不是因數(shù)據(jù)的存在而存在,從而建立了基于http的長連接,提高了 http中數(shù)據(jù)傳輸 的實(shí)時性。并且只發(fā)送一次獲取數(shù)據(jù)的請求即可不斷獲取數(shù)據(jù),不會使服務(wù)器100端及客 戶端200承受較大負(fù)擔(dān),使數(shù)據(jù)傳輸更加簡單、便利,有利于實(shí)際應(yīng)用。為每個執(zhí)行模塊105 配置一個ID,一個執(zhí)行模塊105負(fù)責(zé)一個長連接中的事件傳輸,使數(shù)據(jù)傳輸過程更加精確。 當(dāng)連接建立后,發(fā)送請求以獲取數(shù)據(jù)時,可根據(jù)該執(zhí)行模塊105的ID找到該執(zhí)行模塊105, 通過該執(zhí)行模塊105調(diào)用構(gòu)造模塊106中的命令執(zhí)行器來執(zhí)行該請求事件命令。每種類型 的事件都有專門的瀏覽器適配器加以輸出,提高數(shù)據(jù)輸出的效率。且如果沒有數(shù)據(jù)輸出,服 務(wù)器100還會向客戶端200發(fā)送心跳事件,以使客戶端200獲知服務(wù)器100在沒有數(shù)據(jù)產(chǎn)生 時工作是否正常,使保持連接過程更加完善。并且,本發(fā)明實(shí)施例當(dāng)業(yè)務(wù)請求的類型為非特 殊類型,或者當(dāng)消息隊(duì)列103的定時器超時后還未在其中放入所請求的事件時,關(guān)閉連接, 以節(jié)約網(wǎng)絡(luò)資源。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序 產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí) 施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī) 可用存儲介質(zhì)(包括但不限于磁盤存儲器和光學(xué)存儲器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形 式。
本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一 流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合。可提供這些計(jì)算 機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理 器以產(chǎn)生一個機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生 用于實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能 的裝置。
這些計(jì)算機(jī)程序指令也可存儲在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特 定方式工作的計(jì)算機(jī)可讀存儲器中,使得存儲在該計(jì)算機(jī)可讀存儲器中的指令產(chǎn)生包括指 令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或 多個方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì) 算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或 其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖 一個方框或多個方框中指定的功能的步驟。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精 神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍 之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
1.一種保持連接的方法,其特征在于,包括以下步驟接收連接請求并建立http連接;根據(jù)連接請求創(chuàng)建消息隊(duì)列;通過消息隊(duì)列等待需要傳輸?shù)氖录?,以保持連接。
2.如權(quán)利要求1所述的方法,其特征在于,根據(jù)連接請求創(chuàng)建消息隊(duì)列的步驟包括根 據(jù)所述連接請求構(gòu)造建立連接的事件,根據(jù)建立連接的事件創(chuàng)建消息隊(duì)列。
3.如權(quán)利要求1或2所述的方法,其特征在于,通過消息隊(duì)列等待需要傳輸?shù)氖录?以保持連接的步驟包括在創(chuàng)建消息隊(duì)列后,將任務(wù)的狀態(tài)設(shè)為等待狀態(tài),以保持連接;或 者,不斷的訪問消息隊(duì)列來保持連接。
4.如權(quán)利要求1或2所述的方法,其特征在于,在通過消息隊(duì)列等待需要傳輸?shù)氖录?后還包括步驟發(fā)送確認(rèn)建立連接的響應(yīng)消息。
5.如權(quán)利要求4所述的方法,其特征在于,發(fā)送確認(rèn)建立連接的響應(yīng)消息的步驟包括 發(fā)送攜帶用于標(biāo)識消息隊(duì)列的標(biāo)識符ID的確認(rèn)建立連接的響應(yīng)消息;所述方法還包括步驟接收攜帶所述ID的業(yè)務(wù)請求;將所請求的事件存入攜帶的ID 所對應(yīng)的消息隊(duì)列。
6.如權(quán)利要求1所述的方法,其特征在于,在通過消息隊(duì)列等待需要傳輸?shù)氖录?,以?持連接之后還包括步驟當(dāng)消息隊(duì)列中沒有數(shù)據(jù)封裝成的事件時,將心跳事件存入消息隊(duì) 列并發(fā)送。
7.如權(quán)利要求1所述的方法,其特征在于,在接收連接請求并建立http連接之后還包 括步驟對http連接進(jìn)行檢測,確定是否需要保持連接,當(dāng)需要保持連接時,控制消息隊(duì)列 保持連接,當(dāng)不需要保持連接時,控制消息隊(duì)列關(guān)閉連接。
8.如權(quán)利要求7所述的方法,其特征在于,在所述消息隊(duì)列中設(shè)有定時器;通過消息隊(duì) 列等待需要傳輸?shù)氖录?,還包括步驟所述消息隊(duì)列中的定時器超時時消息隊(duì)列中仍未 有事件放入,則關(guān)閉連接;或者通過消息隊(duì)列等待需要傳輸?shù)氖录?,還包括步驟接收業(yè)務(wù)請求,并在所述業(yè)務(wù)請求 為非特殊請求且請求的業(yè)務(wù)數(shù)據(jù)傳輸完畢時關(guān)閉連接,所述非特殊請求為所請求的數(shù)據(jù)不 需要實(shí)時更新的請求。
9.一種保持連接的方法,其特征在于,包括以下步驟當(dāng)需要請求數(shù)據(jù)時,發(fā)送連接請求;接收確認(rèn)建立連接的響應(yīng)消息,并根據(jù)響應(yīng)消息確認(rèn)建立http連接;確認(rèn)建立連接后發(fā)送業(yè)務(wù)請求,以獲取數(shù)據(jù)。
10.一種保持連接的裝置,應(yīng)用于網(wǎng)絡(luò)側(cè),其特征在于,包括收發(fā)模塊,用于接收連接請求;創(chuàng)建模塊,用于建立http連接,及根據(jù)連接請求創(chuàng)建消息隊(duì)列;分發(fā)模塊,用于通過所述消息隊(duì)列等待需要傳輸?shù)氖录?,以保持連接。
11.如權(quán)利要求10所述的裝置,其特征在于,還包括執(zhí)行模塊,用于根據(jù)所述接收的 連接請求構(gòu)造建立連接的事件;所述創(chuàng)建模塊用于根據(jù)建立連接的事件創(chuàng)建消息隊(duì)列。
12.如權(quán)利要求10或11所述的裝置,其特征在于,所述消息隊(duì)列還用于將所述分發(fā)模塊的狀態(tài)設(shè)為等待狀態(tài),以保持連接;或者,所述分發(fā)模塊還用于不斷的訪問所述消息隊(duì)列 來保持連接。
13.如權(quán)利要求10或11所述的裝置,其特征在于,所述收發(fā)模塊還用于發(fā)送確認(rèn)建立 連接的響應(yīng)消息。
14.如權(quán)利要求13所述的裝置,其特征在于,所述收發(fā)模塊發(fā)送攜帶用于標(biāo)識消息隊(duì) 列的ID的確認(rèn)建立連接的響應(yīng)消息,及接收攜帶所述ID的業(yè)務(wù)請求;所述裝置還包括構(gòu)造模塊,將所請求的事件存入攜帶的ID所對應(yīng)的消息隊(duì)列。
15.如權(quán)利要求10所述的裝置,其特征在于,還包括驗(yàn)證模塊,用于當(dāng)所述消息隊(duì)列 中沒有數(shù)據(jù)封裝成的事件傳輸時,將心跳事件放入所述消息隊(duì)列;所述收發(fā)模塊還用于發(fā)送心跳事件。
16.如權(quán)利要求10所述的裝置,其特征在于,還包括執(zhí)行模塊,用于對http連接進(jìn)行 檢測,確定是否需要保持連接,當(dāng)需要保持連接時,控制消息隊(duì)列保持連接,當(dāng)不需要保持 連接時,控制消息隊(duì)列關(guān)閉連接。
17.如權(quán)利要求16所述的裝置,其特征在于,所述消息隊(duì)列中還包括定時器;所述消息 隊(duì)列還用于當(dāng)自身的定時器超時時仍未有事件放入,則關(guān)閉連接;或者所述收發(fā)模塊還用于接收業(yè)務(wù)請求;所述裝置還包括執(zhí)行模塊,用于當(dāng)所述業(yè)務(wù)請 求為非特殊請求且請求的業(yè)務(wù)數(shù)據(jù)傳輸完畢時關(guān)閉連接,所述非特殊請求為所請求的數(shù)據(jù) 不需要實(shí)時更新的請求。
18.一種保持連接的裝置,應(yīng)用于客戶端,其特征在于,包括收發(fā)模塊,用于當(dāng)需要請求數(shù)據(jù)時,發(fā)送連接請求,接收確認(rèn)建立連接的響應(yīng)消息,及 發(fā)送業(yè)務(wù)請求,以獲取數(shù)據(jù);處理模塊,用于確認(rèn)建立http連接。
全文摘要
本發(fā)明公開了一種保持連接的方法,用于實(shí)現(xiàn)基于http的長連接,提高了http中數(shù)據(jù)傳輸?shù)膶?shí)時性。所述方法包括接收連接請求并建立http連接;根據(jù)連接請求創(chuàng)建消息隊(duì)列;通過消息隊(duì)列等待需要傳輸?shù)臄?shù)據(jù),以保持連接。本發(fā)明還公開了用于實(shí)現(xiàn)所述方法的裝置。
文檔編號G06F17/30GK102035880SQ20101053023
公開日2011年4月27日 申請日期2010年11月2日 優(yōu)先權(quán)日2010年11月2日
發(fā)明者黃志輝 申請人:中興通訊股份有限公司