成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

WebSocket,不再“輪詢”

nodejh / 1705人閱讀

摘要:在尚未被眾多瀏覽器實(shí)現(xiàn)和發(fā)布的時(shí)期,開(kāi)發(fā)者在開(kāi)發(fā)需要接收來(lái)自服務(wù)器的實(shí)時(shí)通知應(yīng)用程序時(shí),不得不求助于一些來(lái)模擬實(shí)時(shí)連接以實(shí)現(xiàn)實(shí)時(shí)通信,最流行的一種方式是長(zhǎng)輪詢。

1.前言
本文先講解WebSocket的應(yīng)用場(chǎng)景和特點(diǎn),然后通過(guò)前后端示例代碼講解,展示在實(shí)際的開(kāi)發(fā)中的應(yīng)用。
1.1. 應(yīng)用場(chǎng)景
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議, 是為了滿足基于 Web 的日益增長(zhǎng)的實(shí)時(shí)通信需求而產(chǎn)生的。我們平時(shí)接觸的大多數(shù)是HTTP的接口,但是在有些業(yè)務(wù)場(chǎng)景中滿足不了我們的需求,這時(shí)候就需要用到WebSocket。簡(jiǎn)單舉兩個(gè)例子:

(1) 頁(yè)面地圖上要實(shí)時(shí)顯示在線人員坐標(biāo):傳統(tǒng)基于HTTP接口的處理方式是輪詢,每次輪詢更新最新的坐標(biāo)信息。

(2)手機(jī)的付款碼頁(yè)面,在外界設(shè)備掃描付款碼支付成功后,手機(jī)付款碼頁(yè)面提示“支付成功”并自動(dòng)關(guān)閉:傳統(tǒng)方式還是輪詢,付款碼頁(yè)面一直調(diào)用接口,直到從服務(wù)器獲取成功支付的狀態(tài)后,手機(jī)提示“支付成功”并關(guān)閉付款碼頁(yè)面。

HTTP 協(xié)議有一個(gè)缺陷:通信只能由客戶端發(fā)起。這種單向請(qǐng)求的特點(diǎn),注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時(shí)候,就發(fā)出一個(gè)詢問(wèn),了解服務(wù)器有沒(méi)有新的信息。但這種方式即浪費(fèi)帶寬(HTTP HEAD 是比較大的),又消耗服務(wù)器 CPU 占用(沒(méi)有信息也要接受請(qǐng)求)。

在WebSocket API尚未被眾多瀏覽器實(shí)現(xiàn)和發(fā)布的時(shí)期,開(kāi)發(fā)者在開(kāi)發(fā)需要接收來(lái)自服務(wù)器的實(shí)時(shí)通知應(yīng)用程序時(shí),不得不求助于一些“hacks”來(lái)模擬實(shí)時(shí)連接以實(shí)現(xiàn)實(shí)時(shí)通信,最流行的一種方式是長(zhǎng)輪詢?。?長(zhǎng)輪詢主要是發(fā)出一個(gè)HTTP請(qǐng)求到服務(wù)器,然后保持連接打開(kāi)以允許服務(wù)器在稍后的時(shí)間響應(yīng)(由服務(wù)器確定)。為了這個(gè)連接有效地工作,許多技術(shù)需要被用于確保消息不錯(cuò)過(guò),如需要在服務(wù)器端緩存和記錄多個(gè)的連接信息(每個(gè)客戶)。雖然長(zhǎng)輪詢是可以解決這一問(wèn)題的,但它會(huì)耗費(fèi)更多的資源,如CPU、內(nèi)存和帶寬等,要想很好的解決實(shí)時(shí)通信問(wèn)題就需要設(shè)計(jì)和發(fā)布一種新的協(xié)議

1.2. WebSocket定義
WebSocket是一種協(xié)議,是一種與HTTP 同等的網(wǎng)絡(luò)協(xié)議,兩者都是應(yīng)用層協(xié)議,都基于 TCP 協(xié)議。但是 WebSocket 是一種雙向通信協(xié)議,在建立連接之后,WebSocket 的 server 與 client 都能主動(dòng)向?qū)Ψ桨l(fā)送或接收數(shù)據(jù)。同時(shí),WebSocket在建立連接時(shí)需要借助 HTTP 協(xié)議,連接建立好了之后 client 與 server 之間的雙向通信就與 HTTP 無(wú)關(guān)了。

相比于傳統(tǒng)HTTP 的每次“請(qǐng)求-應(yīng)答”都要client 與 server 建立連接的模式,WebSocket 是一種長(zhǎng)連接的模式。就是一旦WebSocket 連接建立后,除非client 或者 server 中有一端主動(dòng)斷開(kāi)連接,否則每次數(shù)據(jù)傳輸之前都不需要HTTP 那樣請(qǐng)求數(shù)據(jù)。

WebSocket 對(duì)象提供了一組 API,用于創(chuàng)建和管理 WebSocket 連接,以及通過(guò)連接發(fā)送和接收數(shù)據(jù)。瀏覽器提供的WebSocket API很簡(jiǎn)潔,調(diào)用示例如下:

HTTP、WebSocket 等應(yīng)用層協(xié)議,都是基于 TCP 協(xié)議來(lái)傳輸數(shù)據(jù)的。我們可以把這些高級(jí)協(xié)議理解成對(duì) TCP 的封裝。既然大家都使用 TCP 協(xié)議,那么大家的連接和斷開(kāi),都要遵循 TCP 協(xié)議中的三次握手和四次握手 ,只是在連接之后發(fā)送的內(nèi)容不同,或者是斷開(kāi)的時(shí)間不同。對(duì)于 WebSocket 來(lái)說(shuō),它必須依賴 HTTP 協(xié)議進(jìn)行一次握手 ,握手成功后,數(shù)據(jù)就直接從 TCP 通道傳輸,與 HTTP 無(wú)關(guān)了。

2.后端WebSocket服務(wù)(SpringBoot)
pom.xml

在配置類@Configuration下注冊(cè)ServerEndpointExporter的Bean,這個(gè)bean會(huì)自動(dòng)注冊(cè)使用了@ServerEndpoint注解聲明的Websocket endpoint

創(chuàng)建WebSocket的工具類WebSocket.java

3.到此WebSocket的代碼就結(jié)束了,運(yùn)行該SpringBoot項(xiàng)目,對(duì)應(yīng)的WebSocket地址為:ws://127.0.0.1:port/websocket/{userId}
可以在 WebSocket在線測(cè)試網(wǎng)站 上測(cè)試后端接口。

前端WebSocket調(diào)用(Angular)
3.1. npm依賴
安裝 rxjs 的依賴庫(kù)

安裝websocket 依賴庫(kù)

安裝類型定義文件

3.2. WebSocket Service
創(chuàng)建 WebSocket 的Service文件

上述命令生成了websocket.service.ts文件,示例代碼為:

3.3. Demo演示
簡(jiǎn)單做個(gè)demo頁(yè)面,有留言板和輸入框。同時(shí)開(kāi)多個(gè)瀏覽器頁(yè)面,只要在任意一個(gè)頁(yè)面的輸入框中輸入文字,所有頁(yè)面的留言板上都會(huì)實(shí)時(shí)顯示出來(lái)。

示例的代碼提供,app.component.html

app.component.ts

app.component.css

本人創(chuàng)業(yè)團(tuán)隊(duì)產(chǎn)品MadPecker,主要做BUG管理、測(cè)試管理、應(yīng)用分發(fā),網(wǎng)址:www.madpecker.com,有需要的朋友歡迎試用、體驗(yàn)!
本文為MadPecker團(tuán)隊(duì)技術(shù)人員編寫,轉(zhuǎn)載請(qǐng)標(biāo)明出處

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74902.html

相關(guān)文章

  • 利用express+socket.io實(shí)現(xiàn)一個(gè)簡(jiǎn)易版聊天室

    摘要:用偽代碼來(lái)模擬下長(zhǎng)輪詢的過(guò)程前端利用下面函數(shù)進(jìn)行請(qǐng)求后端代碼做如下更改利用隨機(jī)數(shù)的大小來(lái)模擬是否有新數(shù)據(jù)有新數(shù)據(jù)來(lái)了長(zhǎng)輪詢的確減少了請(qǐng)求的次數(shù),但是它也有著很大的問(wèn)題,那就是耗費(fèi)服務(wù)器的資源。 寫在前面 最近由于利用node重構(gòu)某個(gè)項(xiàng)目,項(xiàng)目中有一個(gè)實(shí)時(shí)聊天的功能,于是就研究了一下聊天室,在線demo|源碼,歡迎大家反饋。這個(gè)聊天室的主要利用到了socket.io和express。這個(gè)...

    Chaz 評(píng)論0 收藏0
  • WebSockets實(shí)戰(zhàn):在 Node 和 React 之間進(jìn)行實(shí)時(shí)通信

    摘要:服務(wù)器推遲響應(yīng),直到發(fā)生更改更新或超時(shí)。旨在取代現(xiàn)有的雙向通信技術(shù)。只要我們對(duì)套接字事件和有了充分的了解,理解和實(shí)現(xiàn)就非常簡(jiǎn)單。 翻譯:瘋狂的技術(shù)宅 原文:blog.logrocket.com/websockets-… showImg(https://user-gold-cdn.xitu.io/2019/5/21/16ada008fc1f81d7); Web 為了支持客戶端和服務(wù)器之間的全...

    DevWiki 評(píng)論0 收藏0
  • 初探WebSocket

    摘要:流控制通常就是在客戶端的頁(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工...

    Channe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<