JavaScript數(shù)據(jù)推送Comet技術(shù)詳解
JavaScript數(shù)據(jù)推送主要致力于webapp的在線推送服務(wù),不用我們每次都像服務(wù)器去發(fā)送Ajax請(qǐng)求而主動(dòng)從Server端推送數(shù)據(jù)到本地。
數(shù)據(jù)推送進(jìn)化史:
1. HTTP協(xié)議簡(jiǎn)易輪詢,保持著一個(gè)鏈接不放,或者通過(guò)前端不停的向后端發(fā)送請(qǐng)求
2. H5更新后有了WebSocket大大改善了雙向和單向推送數(shù)據(jù)的便利性
3. SSE(Server-Send Event):服務(wù)器推送數(shù)據(jù)的新方式
Comet:基于 HTTP 長(zhǎng)連接的服務(wù)器推送技術(shù)
本課時(shí)介紹Comet:基于 HTTP 長(zhǎng)連接的服務(wù)器推送技術(shù),Comet 是一種 Web 應(yīng)用架構(gòu)。服務(wù)器端會(huì)主動(dòng)以異步的方式向客戶端程序推送數(shù)據(jù)(Ajax請(qǐng)求死循環(huán)),而不需要客戶端顯式的發(fā)出請(qǐng)求。Comet 架構(gòu)非常適合事件驅(qū)動(dòng)的 Web 應(yīng)用,以及對(duì)交互性和實(shí)時(shí)性要求很強(qiáng)的應(yīng)用,如股票交易行情分析、聊天室和 Web 版在線游戲等。
1.先來(lái)看一個(gè)最簡(jiǎn)單的ajax請(qǐng)求json數(shù)據(jù)例子:
index.html
<meta charset="utf-8"> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript"> $.ajax({ url: 'data.php', dataType: "json", success: function(data){ console.log(data); } }); </script>
data.php
<?php header('Content-type: application/json;charset=utf-8'); $res = array('success'=>'ok', 'text'=>'我是測(cè)試的文本'); echo json_encode($res); ?>
這樣前端就能獲取后端數(shù)據(jù)并輸出。下面我們來(lái)模擬后端不斷推送數(shù)據(jù)到前端:
一種辦法是前端循環(huán)不斷發(fā)送ajax請(qǐng)求
2.前端jQuery的Ajax不斷發(fā)送請(qǐng)求:
index.html
<meta charset="utf-8"> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript"> function conn(){ $.ajax({ url: 'data.php', dataType: "json", success: function(data){ console.log(data); conn(); } }); } conn(); </script>
data.php
<?php header('Content-type: application/json;charset=utf-8'); header("Cache-Control:max-age=0"); //設(shè)置沒(méi)有緩存 sleep(1); $res = array('success'=>'ok', 'text'=>'我是測(cè)試的文本'); echo json_encode($res); ?>
但是這樣的連接輪詢,網(wǎng)絡(luò)請(qǐng)求浪費(fèi)非常明顯,我們也可以讓后端服務(wù)器來(lái)循環(huán)做這件事情,看下面例子
3.原生Ajax,服務(wù)器隔一段時(shí)間推送一次(后端循環(huán),用ob_flush()和flush()吐數(shù)據(jù))
data.php
<?php // header('Content-type: application/json;charset=utf-8'); header("Cache-Control:max-age=0"); //設(shè)置沒(méi)有緩存 $i = 0; while ($i<9) { $i++; // $res = array('success'=>'ok', 'text'=>'我是測(cè)試的文本'); // echo json_encode($res); sleep(1); $radom = rand(1,999); echo $radom; echo '<br/>'; ob_flush(); //輸出緩存,必須和flush()一起使用 flush(); //緩存吐到瀏覽器 } ?>
前臺(tái)js(原生js實(shí)現(xiàn)ajax,并當(dāng)狀態(tài)改變時(shí),進(jìn)行輸出) 參考:http://www.dbjr.com.cn/article/82085.htm
var getXmlHttpRequest = function() { if (window.XMLHttpRequest) { //主流瀏覽器提供了XMLHttpRequest對(duì)象 return new XMLHttpRequest(); } else if (window.ActiveXObject) { //低版本的IE瀏覽器沒(méi)有提供XMLHttpRequest對(duì)象 //所以必須使用IE瀏覽器的特定實(shí)現(xiàn)ActiveXObject return new ActiveXObject("Microsoft.XMLHttpRequest"); } }; var xhr = getXmlHttpRequest(); xhr.onreadystatechange = function() { console.log(xhr.readyState); if (xhr.readyState === 3 && xhr.status === 200) { //獲取成功后執(zhí)行操作 //數(shù)據(jù)在xhr.responseText console.log(xhr.responseText); } }; xhr.open("get", "data.php", true); xhr.send("");
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)javascript程序設(shè)計(jì)有所幫助。
相關(guān)文章
Javascript實(shí)現(xiàn)Web顏色值轉(zhuǎn)換
這篇文章主要介紹了Javascript實(shí)現(xiàn)Web顏色值轉(zhuǎn)換,需要的朋友可以參考下2015-02-02微信小程序?qū)崿F(xiàn)全國(guó)機(jī)場(chǎng)索引列表
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)全國(guó)機(jī)場(chǎng)索引列表,實(shí)現(xiàn)MUI索引列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01JS中實(shí)現(xiàn)隱藏部分姓名或者電話號(hào)碼的代碼
最近做了小項(xiàng)目,項(xiàng)目需要只顯示用戶的姓名和手機(jī)號(hào)開(kāi)頭跟結(jié)尾,其他部分用*號(hào)代替,下面小編給大家分享一段簡(jiǎn)單的代碼,需要的朋友跟隨腳本之家小編一起看看吧2018-07-07JavaScript獲取兩個(gè)數(shù)組交集的方法
這篇文章主要介紹了JavaScript獲取兩個(gè)數(shù)組交集的方法,涉及javascript針對(duì)數(shù)組的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06微信小程序?qū)W習(xí)筆記之文件上傳、下載操作圖文詳解
這篇文章主要介紹了微信小程序?qū)W習(xí)筆記之文件上傳、下載操作,結(jié)合實(shí)例形式分析了微信小程序圖片文件傳輸?shù)脑怼⒉襟E及后臺(tái)php操作相關(guān)實(shí)現(xiàn)技巧,并結(jié)合圖文形式予以詳細(xì)說(shuō)明,需要的朋友可以參考下2019-03-03TypeScript工具類 Partial 和 Required 的場(chǎng)景分析
這篇文章主要介紹了TypeScript工具類 Partial 和 Required 的詳細(xì)講解,本文通過(guò)場(chǎng)景描述給大家詳細(xì)講解工具類的使用,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09基于javascript實(shí)現(xiàn)checkbox復(fù)選框?qū)嵗a
這篇文章主要介紹了基于javascript實(shí)現(xiàn)checkbox復(fù)選框?qū)嵗a,感興趣的小伙伴們可以參考一下2016-01-01javascript控制Div層透明屬性由淺變深由深變淺逐漸顯示
控制Div層透明屬性,由淺變深逐漸顯示,由深變淺逐漸消失,具體實(shí)現(xiàn)代碼如下,喜歡的朋友可以感受下2013-11-11JavaScript中輸出信息的方法(信息確認(rèn)框-提示輸入框-文檔流輸出)
這篇文章主要介紹了JavaScript中輸出信息的方法(信息確認(rèn)框-提示輸入框-文檔流輸出)的相關(guān)資料,需要的朋友可以參考下2016-06-06