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