<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        淺析nodejs實現Websocket的數據接收與發送_node.js

        來源:懂視網 責編:小采 時間:2020-11-27 21:45:49
        文檔

        淺析nodejs實現Websocket的數據接收與發送_node.js

        淺析nodejs實現Websocket的數據接收與發送_node.js:WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通訊的網絡技術。在WebSocket API中,瀏覽器和服務器只需要要做一個握手(handshaking)的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。 WebSocke
        推薦度:
        導讀淺析nodejs實現Websocket的數據接收與發送_node.js:WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通訊的網絡技術。在WebSocket API中,瀏覽器和服務器只需要要做一個握手(handshaking)的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。 WebSocke
        WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通訊的網絡技術。在WebSocket API中,瀏覽器和服務器只需要要做一個握手(handshaking)的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。

        WebSocket是一個通信的協議,分為服務器和客戶端。服務器放在后臺,保持與客戶端的長連接,完成雙方通信的任務??蛻舳艘话愣际菍崿F在支持HTML5瀏覽器核心中,通過提供JavascriptAPI使用網頁可以建立websocket連接。

        在我寫這篇文章里:基于html5和nodejs相結合實現websocket即使通訊,里面主要是借助了nodejs-websocket這個插件,后來還用了socket.io做了些demo,但是,這些都是借助于別人封裝好的插件做出來的,websocket到底是怎么實現的呢?之前真沒想過,最近看樸靈大神的《深入淺析node.js》時候,看到了websocket那一節,看了websocket的數據幀定義,想著用nodejs實現。經過一番折騰實現了。

        客戶端的代碼就不說了,websocket的API還是很簡單的,就通過onmessage、onopen、onclose,以及send方法就可以實現了。
        websocket api通過onmessage、onopen、onclose以及send方法實現客戶端的代碼。具體詳情就不多說了。

        主要說服務端的代碼:

        首先是協議的升級,這個比較簡單,就簡述一下:當在客戶端執行new Websocket("ws://XXX.com/")的時候,客戶端就會發起請求報文進行握手申請,報文中有個很重要的key就是Sec-WebSocket-Key,服務端獲取到key,然后將這個key與字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11相連,對新的字符串通過sha1安全散列算法計算出結果后,再進行base64編碼,并且將結果放在請求頭的"Sec-WebSocket-Accept"中返回即可完成握手。具體請看代碼:

        upgrade事件其實是http這個模塊的封裝,再往底層就是net模塊的實現,其實都差不多,如果直接用net模塊來實現的話,就是監聽net.createServer返回的server對象的data事件,接收到的第一份數據就是客戶端發來的升級請求報文。

        上面那段代碼就完成了websocket的握手,然后就可以開始數據傳輸了。

        看數據傳輸之前,先看看websocket數據幀的定義(因為覺得深入淺出nodejs里的幀定義圖最容易理解,所以就貼這張了):

        上面的圖中,每一列就是一個字節,一個字節總共是8位,每一位就是一個二進制數,不同位的值會對應不同的意義。

        fin:指示這個是消息的最后片段。第一個片段可能也是最后的片段。如果為1即為最后片段,(其實這個位的用途我個人有點疑惑,按照書上以及網上查的資料,當數據被分片的時候,不同片應該都會有fin位,會根據fin為是不是0來判斷是否為最后一幀,但是實際實現中卻發現,當數據比較大需要分片時,服務端收到的數據就只有第一幀是有fin位為1,其他幀則整個幀都是數據段,也就是說,感覺這個fin位似乎用不上,至少我自己寫的demo中是通過數據長度來判斷是否到了最后一幀,完全沒用到這個fin位是否為1來判斷)

        rsv1、rsv2、rsv3:各占一個位,用于擴展協商,基本上不怎么需要理,一般都是0

        opcode:占四個位,可以表示0~15的十進制,0表示為附加數據幀,1表示為文本數據幀,2表示二進制數據幀,8表示發送一個連接關閉的數據幀,9表示ping,10表示pong,ping和pong都是用于心跳檢測,當一端發送ping時,另一端必須響應pong表示自己仍處于響應狀態。

        masked:占一個位,表示是否進行掩碼處理,客戶端發送給服務端時為1,服務端發送給客戶端時為0

        payload length:占7位,或者7+16位、或者7+64位。如果第二個字節的后面七個位的十進制值小于或等于125,則直接用這七個位表示數據長度;如果該值為126,說明 125<數據長度<65535(16個位能描述的最大值,也就是16個1的時候),就用第三個字節及第四個字節即16個位來表示;如果該值為127,則說明數據長度已經大于65535,16個位也已經不足以描述數據長度了,就用第三到第十個字節這八個字節來描述數據長度。

        masking key:當masked為1的時候才存在,用于對我們需要的數據進行解密。

        payload data:我們需要的數據,如果masked為1,該數據會被加密,要通過masking key進行異或運算解密才能獲取到真實數據。

        幀定義解釋完了,就可以根據數據來進行解析了,當有data過來的時候,先獲取需要的數據信息,下面這段代碼將獲取到數據在data里的位置,以及數據長度,masking key以及opcode:

        代碼中均有注釋,理解起來應該不難,直接看下一步,獲取到數據信息后,就要對數據進行實際解析了:

        經過上面handleDataStat方法的處理,stat中已經有了data的相關數據,先判斷opcode,如果為9說明是客戶端發起的ping心跳檢測,直接返回pong響應,如果為10則為服務端發起的心跳檢測。如果有masking key,則遍歷數據段,對每個字節都與masking key的字節進行異或運算(網上看到一個說法很形象:就是輪流發生X關系),^符號就是進行異或運算啦。如果沒有masking key則直接通過slice方法把數據截取下來。

        獲取到數據后,放進datas里保存,因為有可能數據被分片了,所以再將stat里的長度減去當前數據長度,只有當stat里的長度為0的時候,說明當前幀為最后一幀,然后通過Buffer.concat將所有數據合并,此時再判斷一下opcode,如果opcode為8,則說明客戶端發起了一個關閉請求,而我們獲取到的數據則是關閉原因。如果不為8,則這數據就是我們需要的數據。然后再將stat重置為null,datas數組置空即可。至此,我們的數據解析就完成了。

        完成了客戶端發來的數據解析,還需要一個服務端發數據至客戶端的方法,也就是按照上面所說的幀定義來組裝數據并且發送出去。下面的代碼中基本上每一行都有注釋,應該還是比較容易理解的。

        最后還要實現一個功能,就是心跳檢測:防止服務端長時間不與客戶端交互而導致客戶端關閉連接,所以每隔十秒都會發送一次ping進行心跳檢測

        至此,整個websocket的實現就完成了,此demo只是大概實現了一下websocket而已,在安全之類方面肯定還是有很多問題,若是真正生產環境中還是用socket.io這類成熟的插件比較好。不過這還是很值得一學的。

        以上內容就是小編給大家分享的淺析nodejs實現Websocket的數據接收與發送的全部內容,希望大家喜歡。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        淺析nodejs實現Websocket的數據接收與發送_node.js

        淺析nodejs實現Websocket的數據接收與發送_node.js:WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通訊的網絡技術。在WebSocket API中,瀏覽器和服務器只需要要做一個握手(handshaking)的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。 WebSocke
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 在线观看午夜亚洲一区| 免费人成在线观看播放国产| 国产亚洲AV无码AV男人的天堂| 免费观看亚洲人成网站| 国产免费拔擦拔擦8x| 精品久久久久久亚洲中文字幕 | 日韩免费视频一区二区| 91在线亚洲综合在线| 男女超爽刺激视频免费播放| 亚洲四虎永久在线播放| 美丽姑娘免费观看在线观看中文版| 在线观看免费成人| 亚洲精品无码久久久久牙蜜区| 午夜网站免费版在线观看| 激情无码亚洲一区二区三区 | 在线看无码的免费网站| 亚洲国产日韩在线成人蜜芽| 毛片A级毛片免费播放| 337P日本欧洲亚洲大胆精品| 亚洲真人日本在线| 99久久99这里只有免费的精品| 久久精品国产亚洲夜色AV网站| 亚洲а∨精品天堂在线| 亚洲 国产 图片| 亚洲字幕在线观看| 中文字幕无码毛片免费看| 亚洲av不卡一区二区三区| 91精品国产免费久久久久久青草| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 国产AⅤ无码专区亚洲AV| 国产一级片免费看| 亚洲午夜未满十八勿入网站2| 亚洲av无码专区在线观看亚| 两性刺激生活片免费视频| 黄色三级三级免费看| 亚洲国产精品国自产拍电影| 午夜dj免费在线观看| 国产一级a毛一级a看免费人娇| 亚洲人成激情在线播放| 亚洲人成电影网站国产精品| 亚洲免费视频观看|