AJAX實(shí)現(xiàn)跨域的幾種方法(二)

接上文AJAX實(shí)現(xiàn)跨域的幾種方法(一)
這一篇是關(guān)于CometWeb Sockets的筆記伞梯。

2.4 Comet

Ajax是一種從頁(yè)面向服務(wù)器請(qǐng)求數(shù)據(jù)的技術(shù)抱冷,而Comet則是一種服務(wù)器向頁(yè)面推送數(shù)據(jù)的技術(shù)
Comet能夠讓信息近乎實(shí)時(shí)的被推送到頁(yè)面上袜腥,非常適合處理體育比賽的分?jǐn)?shù)和股票報(bào)價(jià)漆腌。

有兩種實(shí)現(xiàn)Comet的方式:長(zhǎng)輪詢畔派。

2.4.1 長(zhǎng)輪詢

長(zhǎng)輪詢是短輪詢(瀏覽器定時(shí)向服務(wù)器發(fā)送請(qǐng)求槐沼,看有沒有更新的數(shù)據(jù))的一個(gè)翻版曙蒸。
所謂長(zhǎng)輪詢指的是

頁(yè)面發(fā)起一個(gè)到服務(wù)器的請(qǐng)求捌治,然后服務(wù)器一直保持連接打開,直到有數(shù)據(jù)可發(fā)送逸爵。發(fā)送完數(shù)據(jù)后具滴,瀏覽器關(guān)閉連接,隨即又發(fā)送一個(gè)到服務(wù)器的新請(qǐng)求师倔。這一過程在頁(yè)面打開期間一直持續(xù)不斷。

無論是短輪詢還是長(zhǎng)輪詢周蹭,瀏覽器都要在接收數(shù)據(jù)之前趋艘,先發(fā)起對(duì)服務(wù)器的連接。兩者最大的區(qū)別在于服務(wù)器如何發(fā)送數(shù)據(jù)凶朗。

  • 短輪詢是服務(wù)器立即發(fā)送響應(yīng)瓷胧,無論數(shù)據(jù)是否有效。
  • 長(zhǎng)輪詢時(shí)等待發(fā)送響應(yīng)棚愤。

輪詢的優(yōu)勢(shì)是所有瀏覽器都支持搓萧,因?yàn)槭褂?code>XHR對(duì)象和setTimeOut()就能實(shí)現(xiàn)。而程序員要做的就是決定什么時(shí)候發(fā)送請(qǐng)求宛畦。

2.4.2 HTTP流

流不同于上述兩種輪詢瘸洛,因?yàn)樗陧?yè)面的整個(gè)生命周期內(nèi)只用一個(gè)HTTP連接。具體來說次和,就是瀏覽器向服務(wù)器發(fā)送一個(gè)請(qǐng)求反肋,而服務(wù)器保持連接打開,然后周期性的向?yàn)g覽器發(fā)送數(shù)據(jù)踏施。

所有服務(wù)器端語言都支持打印到輸出緩存然后刷新(將輸出緩存中的內(nèi)容一次性全部發(fā)送到客戶端)的功能石蔗,而這正是實(shí)現(xiàn)HTTP流的關(guān)鍵所在。

在FireFox畅形、Safari养距、Opera和Chrome中,通過偵聽readystatechange事件及檢測(cè)readyState的值是否為3日熬,就可以利用XHR對(duì)象實(shí)現(xiàn)HTTP流棍厌。在上述這些瀏覽器中,隨著不斷從服務(wù)器接受數(shù)據(jù)碍遍,readyState的值會(huì)周期性的變?yōu)?定铜。當(dāng)readyState的值變?yōu)?時(shí),responseText屬性中就會(huì)保存接收到的所有數(shù)據(jù)怕敬。此時(shí)揣炕,就需要比較此前接收到的數(shù)據(jù),決定從什么位置開始取得最新的數(shù)據(jù)东跪,使用XHR對(duì)象實(shí)現(xiàn)HTTP流的典型代碼如下所示畸陡。

function createStreamClient (url, progress, finished) {
    var xhr = new XMLHttpRequest(), received = 0;
    xhr.open('get', url, true);
    xhr.onreadystatechange = function () {
        var result;
        if (xhr.readyState == 3) {
            // 只取得最新數(shù)據(jù)并調(diào)整計(jì)數(shù)器
            result = xhr.responseText.substring(received);
            received += result.length;

            process(result);
        } else if (xhr.readyState == 4) {
            finished(xhr.responseText);
        }
    }
    xhr.send(null);
    return xhr;
}

var client = createStreamingClient('streanming.php', function (data) {
    console.log('received: ' + data);
}, function (data) {
    console.log('done');
})

這里的createStreamingClient()函數(shù)接受三個(gè)參數(shù):要連接的URL鹰溜、在接收到數(shù)據(jù)時(shí)調(diào)用的函數(shù)以及關(guān)閉連接時(shí)調(diào)用的函數(shù)。有時(shí)當(dāng)連接關(guān)閉時(shí)還需要重新建立丁恭,所以關(guān)注連接什么時(shí)候關(guān)閉還是很有必要的曹动。

只要readystatechange事件發(fā)生,而且readyState為3牲览,就對(duì)responseText進(jìn)行分割以獲得最新數(shù)據(jù)墓陈。這里的received變量用于記錄已經(jīng)處理了多少個(gè)字符,每次readyState值為3時(shí)都遞增第献。然后贡必,通過process回調(diào)函數(shù)處理傳入的新數(shù)據(jù)。而當(dāng)readyState為4時(shí)庸毫,則執(zhí)行finished回調(diào)函數(shù)仔拟,傳入響應(yīng)返回的全部?jī)?nèi)容。

為了簡(jiǎn)化Comet飒赃,瀏覽器社區(qū)又提供了兩個(gè)新的接口利花。

2.4.3 SSE

SSE(Server-Sent Events,服務(wù)器發(fā)送事件)是圍繞只讀Comet交互推出的新API载佳。SSE API用于創(chuàng)建到服務(wù)器的單向連接炒事,服務(wù)器通過這個(gè)連接可以發(fā)送任意數(shù)量的數(shù)據(jù)。服務(wù)器響應(yīng)的MIME類型必須是text / event-stream刚盈,而且是瀏覽器中的JS API能解析格式輸出羡洛。SSE支持短輪詢、長(zhǎng)輪詢和HTTP流藕漱,而且能在斷開連接時(shí)自動(dòng)確定合適重新連接欲侮。

2.5 Web Sockets

web sockets是一種瀏覽器的API,它的目標(biāo)是在一個(gè)單獨(dú)的持久連接上提供全雙工肋联、雙向通信威蕉。(同源策略對(duì)web sockets不適用)
web sockets原理:在js創(chuàng)建了web socket之后,會(huì)有一個(gè)HTTP請(qǐng)求發(fā)送到瀏覽器以發(fā)起連接橄仍。取得服務(wù)器響應(yīng)后韧涨,建立的連接會(huì)使用HTTP升級(jí)從HTTP協(xié)議交換為web sockt協(xié)議。
只有在支持web socket協(xié)議的服務(wù)器上才能正常工作侮繁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虑粥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宪哩,更是在濱河造成了極大的恐慌娩贷,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锁孟,死亡現(xiàn)場(chǎng)離奇詭異彬祖,居然都是意外死亡茁瘦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門储笑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甜熔,“玉大人,你說我怎么就攤上這事突倍∏幌。” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵羽历,是天一觀的道長(zhǎng)烧颖。 經(jīng)常有香客問我,道長(zhǎng)窄陡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任拆火,我火速辦了婚禮跳夭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘们镜。我一直安慰自己币叹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布模狭。 她就那樣靜靜地躺著颈抚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嚼鹉。 梳的紋絲不亂的頭發(fā)上贩汉,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音锚赤,去河邊找鬼匹舞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛线脚,可吹牛的內(nèi)容都是我干的赐稽。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼浑侥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼姊舵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寓落,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤括丁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后零如,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躏将,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锄弱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祸憋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片会宪。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚯窥,靈堂內(nèi)的尸體忽然破棺而出掸鹅,到底是詐尸還是另有隱情,我是刑警寧澤拦赠,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布巍沙,位于F島的核電站,受9級(jí)特大地震影響荷鼠,放射性物質(zhì)發(fā)生泄漏句携。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一允乐、第九天 我趴在偏房一處隱蔽的房頂上張望矮嫉。 院中可真熱鬧,春花似錦牍疏、人聲如沸蠢笋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至括袒,卻和暖如春厦滤,著一層夾襖步出監(jiān)牢的瞬間援岩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工馁害, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窄俏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓碘菜,卻偏偏與公主長(zhǎng)得像凹蜈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忍啸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容