摘要:長(zhǎng)輪循長(zhǎng)輪循是對(duì)定時(shí)輪詢的改進(jìn)和提高,目地是為了降低無效的網(wǎng)絡(luò)傳輸。是規(guī)范的一部分,它是一種流技術(shù),它的規(guī)范由兩部分組成,第一個(gè)部分是服務(wù)器端與瀏覽器端之間的通訊協(xié)議,第二部分則是在瀏覽器端提供使用的對(duì)象。下一篇之客戶端與服務(wù)器端的交互二
1. 長(zhǎng)鏈接技術(shù)介紹
說到websocket,必須講到在它之前的各種長(zhǎng)鏈接技術(shù),比如輪循,長(zhǎng)輪循,sse等。長(zhǎng)鏈接顧名思義,就是讓客戶端瀏覽器與服務(wù)器端保持長(zhǎng)久的連接,并能持續(xù)通訊,它還有一個(gè)特點(diǎn),就是反向ajax,或叫服務(wù)器推技術(shù)。也就是說,服務(wù)器端也能通過這些手段實(shí)現(xiàn)向客戶端推送的技術(shù),比如,在現(xiàn)實(shí)應(yīng)用中,看到的股票數(shù)據(jù)實(shí)時(shí)更新,這是通過這種技術(shù)來實(shí)現(xiàn)的。因?yàn)榉?wù)器端無法主動(dòng)的向客戶端推送數(shù)據(jù),只能通過客戶端連接上服務(wù)器端,然后被動(dòng)地推送數(shù)據(jù),這些連接到服務(wù)器端或者服務(wù)器端向客戶端發(fā)送數(shù)據(jù)的方法就可以分成很多種,比如最簡(jiǎn)單的就是通過ajax隔一段時(shí)間發(fā)送http請(qǐng)求。
像輪循,長(zhǎng)輪循等技術(shù)并不能實(shí)現(xiàn)真正意義上的實(shí)時(shí),它是模擬型的實(shí)時(shí),它發(fā)送的是完整的http請(qǐng)求。下面來具體說一下每個(gè)技術(shù)的特點(diǎn)。
輪循,也叫短輪循,英文名也叫Polling。它很簡(jiǎn)單,只是用ajax隔一段時(shí)間,可能是1秒,2秒,時(shí)間自己設(shè)定,向服務(wù)器發(fā)送請(qǐng)求。這種方案會(huì)頻繁地與服務(wù)器通訊,每次通訊都是發(fā)送完整的http請(qǐng)求,如果服務(wù)器經(jīng)常有數(shù)據(jù)變動(dòng),有回應(yīng)還好,有時(shí)候發(fā)送的請(qǐng)求都是沒有意義,都是在等服務(wù)器端的回應(yīng),而服務(wù)器又沒有任何改變,所以這種方式很消耗網(wǎng)絡(luò)資源,很低效。
長(zhǎng)輪循是對(duì)定時(shí)輪詢的改進(jìn)和提高,目地是為了降低無效的網(wǎng)絡(luò)傳輸。這種方式也是通過ajax請(qǐng)求發(fā)送數(shù)據(jù)到服務(wù)器端,服務(wù)器端一直hold住這個(gè)連接,直到有數(shù)據(jù)到達(dá),通過這種機(jī)制來減少無效的客戶端和服務(wù)器間的交互,比如可以通過這種方式實(shí)現(xiàn)簡(jiǎn)易型的聊天室,但是,如果服務(wù)端的數(shù)據(jù)變更非常頻繁的話,或者說訪問的人非常多的時(shí)候,這種機(jī)制和定時(shí)輪詢比較起來沒有本質(zhì)上的性能的提高。
英文名也叫HTML5 Server Sent Events (SSE) / EventSource。SSE是html5規(guī)范的一部分,它是一種流技術(shù),它的規(guī)范由兩部分組成,第一個(gè)部分是服務(wù)器端與瀏覽器端之間的通訊協(xié)議,第二部分則是在瀏覽器端提供 JavaScript 使用的 EventSource 對(duì)象。服務(wù)器端的響應(yīng)的內(nèi)容類型是“text/event-stream”,響應(yīng)文本的內(nèi)容可以看成是一個(gè)事件流,它能夠持續(xù)不斷地向服務(wù)器端推送數(shù)據(jù)。不過這種技術(shù)很難跨域,且對(duì)IE的支持并不好,但也不能代表這種技術(shù)是沒用或過時(shí)的,用它結(jié)合PostgreSQL的notify,或者Redis的pub/sub可以輕易構(gòu)建聊天室。
2. websocket上述的幾種方法不代表就是過時(shí)沒用的,相反,在某一程度上,它們還在應(yīng)用中,只是,現(xiàn)在我們要來介紹一種更為好,更實(shí)時(shí)的技術(shù),它叫websocket。它也是一種協(xié)議,它是基于tcp協(xié)議的,它跟http協(xié)議同級(jí),它在瀏覽器層次發(fā)揮作用,可以由http協(xié)議升級(jí)為ws協(xié)議,就像是http加個(gè)安全通道升級(jí)為https協(xié)議一樣。它的原理是這樣的,由于它是一個(gè)協(xié)議,它不用發(fā)送跟http同樣多的頭信息,它比較輕量,速度快。為了建立一個(gè) WebSocket 連接,客戶端瀏覽器首先要向服務(wù)器發(fā)起一個(gè) HTTP 請(qǐng)求,這個(gè)請(qǐng)求和通常的 HTTP 請(qǐng)求不同,包含了一些附加頭信息,其中附加頭信息”Upgrade: WebSocket”表明這是一個(gè)申請(qǐng)協(xié)議升級(jí)的 HTTP 請(qǐng)求,服務(wù)器端解析這些附加的頭信息然后產(chǎn)生應(yīng)答信息返回給客戶端,客戶端和服務(wù)器端的 WebSocket 連接就建立起來了,雙方就可以通過這個(gè)連接通道自由的傳遞信息,并且這個(gè)連接會(huì)持續(xù)存在直到客戶端或者服務(wù)器端的某一方主動(dòng)的關(guān)閉連接。
在github.com或trello.com等應(yīng)用就可以看到websocket的使用。比如,github上的:
請(qǐng)求 Request URL:wss://live.github.com/_sockets/NzQwNjQzOjA4NmI3MGI3ODE2N2JmNGI2OTkwNTI1MzA3NjVjNjYxOjgxYTFjMzVlYTE0NDBkYTUxYjllNTc2NmNjYmE1MDg0ZWY2M2ZiZDQ1NWFmOTM5MWIwMmNlYTMzOGZlYWIwMzY=--46b941101badcb9affe775bd52bf902d4b57468c Request Method:GET Status Code:101 Switching Protocols 響應(yīng)頭信息 Response Headers Connection:Upgrade Sec-WebSocket-Accept:ihEYOEOsteVV84Y2koOeMRELVT8= Server:GitHub.com Upgrade:websocket 請(qǐng)求頭信息 Request Headers Connection:Upgrade Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits Sec-WebSocket-Key:+wcmQ7sbHbIF7K/sGpkOKw== Sec-WebSocket-Version:13 Upgrade:websocket
本篇完結(jié)。
下一篇:websocket之客戶端與服務(wù)器端的交互(二)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/79548.html
時(shí)間:2018年04月11日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s... 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅(qū)動(dòng)、異步非阻塞的IO Java開源框架 基于NIO的客戶...
摘要:概述本文是系列的第一篇,主要介紹相關(guān)的基礎(chǔ)協(xié)議知識(shí)和??蛻舳耸盏巾憫?yīng)后,立即發(fā)起下一次的請(qǐng)求。收到消息通過事件來接收消息。類型則需要傳遞一個(gè)對(duì)象作為參數(shù),相關(guān)的內(nèi)容也將在本系列第二篇中進(jìn)行介紹。 概述 本文是WebSocket系列的第一篇,主要介紹WebSocket相關(guān)的基礎(chǔ)協(xié)議知識(shí)和API。由于WebSocket的相關(guān)介紹在MDN中分布較亂,初學(xué)者不太容易入門,因此通過本文將相關(guān)基礎(chǔ)...
摘要:與此同時(shí),后端服務(wù)的中也有相關(guān)的長(zhǎng)連接維持時(shí)長(zhǎng)設(shè)置。如何快速的恢復(fù)連接根據(jù)上面的操作方案,我們會(huì)在網(wǎng)絡(luò)異常時(shí)斷開連接。 概述 通過前四篇博客,相信讀者對(duì)于WebSocket的使用和數(shù)據(jù)(不論是ArrayBuffer還是String)傳輸都有了一個(gè)深刻的了解?,F(xiàn)在我們來介紹下,我在使用WebSocket時(shí),連接相關(guān)模塊遇到的一些共性問題,以及我們?nèi)绾谓鉀Q這些問題。 本文作為WebSock...
摘要:本文作為系列的第四篇內(nèi)容,將會(huì)用一個(gè)簡(jiǎn)單的聊天應(yīng)用把整個(gè)傳輸二進(jìn)制數(shù)據(jù)類型的內(nèi)容連接起來,讓用戶對(duì)整個(gè)傳輸二進(jìn)制數(shù)據(jù)的方法有個(gè)了解。如何發(fā)送二進(jìn)制數(shù)據(jù)通過如何設(shè)計(jì)一個(gè)二進(jìn)制協(xié)議一章,我們知道了如何定義傳輸?shù)亩M(jìn)制數(shù)據(jù)格式。 概述 通過前三篇博客,我們能夠了解在通過WebSocket發(fā)送數(shù)據(jù)之前,我們需要傳遞的數(shù)據(jù)是如何變成ArrayBuffer二進(jìn)制數(shù)據(jù)的;在我們收到二進(jìn)制數(shù)據(jù)之后,我...
閱讀 2066·2021-11-24 09:38
閱讀 3405·2021-11-22 12:07
閱讀 1977·2021-09-22 16:03
閱讀 2051·2021-09-02 15:41
閱讀 2694·2021-07-24 23:28
閱讀 2292·2019-08-29 13:17
閱讀 1606·2019-08-29 12:25
閱讀 2724·2019-08-29 11:10