摘要:協(xié)議做不到服務(wù)器主動(dòng)向客戶端推送信息。這種單向請(qǐng)求的特點(diǎn),注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。雙向通信,服務(wù)器可以向客戶端主動(dòng)發(fā)送數(shù)據(jù)。數(shù)據(jù)格式比較輕量,性能開(kāi)銷小,通信高效。
為什么需要 WebSocket?
因?yàn)閭€(gè)人對(duì)概念理解不是很深,文字表達(dá)能力不強(qiáng),如果有關(guān)HTTP等方面描述不準(zhǔn)確,歡迎糾正,謝謝大家
初次接觸 WebSocket 的人,都會(huì)問(wèn)同樣的問(wèn)題:我們已經(jīng)有了 HTTP 協(xié)議,為什么還需要另一個(gè)協(xié)議?它能帶來(lái)什么好處?輪詢請(qǐng)求的缺點(diǎn):答案很簡(jiǎn)單,因?yàn)?HTTP 協(xié)議有一個(gè)缺陷:通信只能由客戶端發(fā)起。
舉例來(lái)說(shuō):我們想了解今天的天氣,只能是客戶端向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器返回查詢結(jié)果。HTTP 協(xié)議做不到服務(wù)器主動(dòng)向客戶端推送信息。
這種單向請(qǐng)求的特點(diǎn),注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":設(shè)置定時(shí)器每隔一段時(shí)候,就發(fā)出一個(gè)"詢問(wèn)"(簡(jiǎn)單理解為ajax請(qǐng)求),了解服務(wù)器有沒(méi)有新的信息。最典型的場(chǎng)景就是聊天室。
---- 參考了阮一峰老師的文章: WebSocket 教程
不停地鏈接,斷開(kāi),鏈接,斷開(kāi)請(qǐng)求,浪費(fèi)很多服務(wù)器資源
浪費(fèi)帶寬
移動(dòng)端浪費(fèi)流量
websocket的優(yōu)點(diǎn):沒(méi)有同源限制,客戶端可以與任意服務(wù)器通信,不涉及到跨域的問(wèn)題。
雙向通信,服務(wù)器可以向客戶端主動(dòng)發(fā)送數(shù)據(jù)。
數(shù)據(jù)格式比較輕量,性能開(kāi)銷小,通信高效。
websocket為什么高效普通的http通信是基于字符的通信(超文本), websocket一開(kāi)始是文本協(xié)議, 當(dāng)鏈接建立后變成二進(jìn)制協(xié)議, 數(shù)據(jù)無(wú)需轉(zhuǎn)換,因此效率高。socket.io的使用
socket.io是一個(gè)封裝后的庫(kù),原生 websocket 比較復(fù)雜,需要自己處理請(qǐng)求頭,設(shè)置持續(xù)鏈接等等。因此使用socket.io安裝
npm i socket.io -D
socket主要有兩個(gè)方法:
sock.emit("name", data) 主動(dòng)發(fā)送數(shù)據(jù)
sock.on("name", function(data){ })` 接收數(shù)據(jù)
// server.js const http = require("http") const io = require("socket.io") let server = http.createServer((req, res)=>{}) server.listen(8080) // 建立ws websocket簡(jiǎn)稱ws let wsServer = io.listen(server); wsServer.on("connection", sock=>{ sock.on("aaa", function(a,b){ // name -> "aaa" 要與前臺(tái)的 name 保持一致 console.log(a) console.log(b) console.log(arguments) }) // "aaa"事件名與前臺(tái)的一致 setInterval(function(){ sock.emit("bbb", "服務(wù)器發(fā)來(lái)的數(shù)據(jù)") // name -> "bbb" 要與前臺(tái)的 name 保持一致 }, 2000) })2. 客戶端
上面的代碼直接復(fù)制下來(lái)就能使用。怎么運(yùn)行nodejs服務(wù)我就不再講了啊。
怎么樣,是不是特別簡(jiǎn)單
媽媽再也不用擔(dān)心我的學(xué)習(xí)了~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/104227.html
摘要:流控制通常就是在客戶端的頁(yè)面使用一個(gè)隱藏的窗口向服務(wù)端發(fā)出一個(gè)長(zhǎng)連接的請(qǐng)求。和長(zhǎng)鏈接以上幾種服務(wù)器推的技術(shù)中長(zhǎng)輪詢和流控制其實(shí)都是基于長(zhǎng)鏈接來(lái)實(shí)現(xiàn)的,也就是中所謂的。通信協(xié)議于年被定為標(biāo)準(zhǔn),并被所補(bǔ)充規(guī)范。 初探WebSocket node websocket socket.io 我們平常開(kāi)發(fā)的大部分web頁(yè)面都是主動(dòng)‘拉’的形式,如果需要更新頁(yè)面內(nèi)容,則需要刷新一個(gè),但Slack工...
摘要:原生使用起來(lái)不太方便,我們使用,它很好地封裝了接口,提供了更簡(jiǎn)單靈活的接口,也對(duì)不支持的瀏覽器提供了向下兼容。 原生WebSocket API使用起來(lái)不太方便,我們使用Socket.io,它很好地封裝了webSocket接口,提供了更簡(jiǎn)單、靈活的接口,也對(duì)不支持webSocket的瀏覽器提供了向下兼容。 服務(wù)端代碼 根據(jù)不同客戶端傳來(lái)的消息存儲(chǔ)一下 不同的對(duì)象 需要安裝 npm i ...
摘要:原生使用起來(lái)不太方便,我們使用,它很好地封裝了接口,提供了更簡(jiǎn)單靈活的接口,也對(duì)不支持的瀏覽器提供了向下兼容。 原生WebSocket API使用起來(lái)不太方便,我們使用Socket.io,它很好地封裝了webSocket接口,提供了更簡(jiǎn)單、靈活的接口,也對(duì)不支持webSocket的瀏覽器提供了向下兼容。 服務(wù)端代碼 根據(jù)不同客戶端傳來(lái)的消息存儲(chǔ)一下 不同的對(duì)象 需要安裝 npm i ...
摘要:原生使用起來(lái)不太方便,我們使用,它很好地封裝了接口,提供了更簡(jiǎn)單靈活的接口,也對(duì)不支持的瀏覽器提供了向下兼容。 原生WebSocket API使用起來(lái)不太方便,我們使用Socket.io,它很好地封裝了webSocket接口,提供了更簡(jiǎn)單、靈活的接口,也對(duì)不支持webSocket的瀏覽器提供了向下兼容。 服務(wù)端代碼 根據(jù)不同客戶端傳來(lái)的消息存儲(chǔ)一下 不同的對(duì)象 需要安裝 npm i ...
閱讀 2822·2023-04-26 02:00
閱讀 2780·2019-08-30 15:54
閱讀 871·2019-08-30 11:15
閱讀 1511·2019-08-29 15:31
閱讀 925·2019-08-29 14:12
閱讀 495·2019-08-29 13:08
閱讀 847·2019-08-27 10:51
閱讀 2715·2019-08-26 12:17