<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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        WebSocket通信使用剖析

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

        WebSocket通信使用剖析

        WebSocket通信使用剖析:這次給大家帶來WebSocket通信使用剖析,WebSocket通信使用剖析的注意事項有哪些,下面就是實戰案例,一起來看一下。什么是 WebSocket ?WebSocket 是一種標準協議,用于在客戶端和服務端之間進行雙向數據傳輸。但它跟 HTTP 沒什么關系,它是基于 TC
        推薦度:
        導讀WebSocket通信使用剖析:這次給大家帶來WebSocket通信使用剖析,WebSocket通信使用剖析的注意事項有哪些,下面就是實戰案例,一起來看一下。什么是 WebSocket ?WebSocket 是一種標準協議,用于在客戶端和服務端之間進行雙向數據傳輸。但它跟 HTTP 沒什么關系,它是基于 TC

        RSV1, RSV2, RSV3:各占 1bit

        一般情況下全為 0。當客戶端、服務端協商采用 WebSocket 擴展時,這三個標志位可以非
        0,且值的含義由擴展進行定義。如果出現非零的值,且并沒有采用 WebSocket 擴展,連接出錯。

        Opcode: 4bit

        %x0:表示一個延續幀。當 Opcode 為 0 時,表示本次數據傳輸采用了數據分片,當前收到的數據幀為其中一個數據分片;
        %x1:表示這是一個文本幀(text frame);
        %x2:表示這是一個二進制幀(binary frame);
        %x3-7:保留的操作代碼,用于后續定義的非控制幀;
        %x8:表示連接斷開;
        %x9:表示這是一個心跳請求(ping);
        %xA:表示這是一個心跳響應(pong);
        %xB-F:保留的操作代碼,用于后續定義的控制幀。

        Mask: 1bit

        表示是否要對數據載荷進行掩碼異或操作。
        0:否
        1:是

        Payload length: 7bit or (7 + 16)bit or (7 + 64)bit

        表示數據載荷的長度
        0~126:數據的長度等于該值;
        126:后續 2 個字節代表一個 16 位的無符號整數,該無符號整數的值為數據的長度;
        127:后續 8 個字節代表一個 64 位的無符號整數(最高位為 0),該無符號整數的值為數據的長度。

        Masking-key: 0 or 4bytes

        當 Mask 為 1,則攜帶了 4 字節的 Masking-key;
        當 Mask 為 0,則沒有 Masking-key。
        掩碼算法:按位做循環異或運算,先對該位的索引取模來獲得 Masking-key 中對應的值 x,然后對該位與 x 做異或,從而得到真實的 byte 數據。
        注意:掩碼的作用并不是為了防止數據泄密,而是為了防止早期版本的協議中存在的代理緩存污染攻擊(proxy cache poisoning attacks)等問題。

        Payload Data: 載荷數據

        解析 WebSocket 報文代碼如下:

        def read_msg(data):
         logging.debug(data)
         msg_len = data[1] & 127 # 數據載荷的長度
         if msg_len == 126:
         mask = data[4:8] # Mask 掩碼
         content = data[8:] # 消息內容
         elif msg_len == 127:
         mask = data[10:14]
         content = data[14:]
         else:
         mask = data[2:6]
         content = data[6:]
         raw_str = '' # 解碼后的內容
         for i, d in enumerate(content):
         raw_str += chr(d ^ mask[i % 4])
         return raw_str

        服務端發送 WebSocket 報文

        返回時不攜帶掩碼,所以 Mask 位為 0,再按載荷數據的大小寫入長度,最后寫入載荷數據。

        struct 模塊解析

        struct.pack(fmt, v1, v2, ...)

        按照給定的格式 fmt,把數據封裝成字符串 ( 實際上是類似于 C 結構體的字節流 )

        struct 中支持的格式如下表:

        FormatC TypePython typeStandard size
        xpad byteno value
        ccharbytes of length 11
        bsigned charinteger1
        Bunsigned charinteger1
        ?_Boolbool1
        hshortinteger2
        Hunsigned shortinteger2
        iintinteger4
        Iunsigned intinteger4
        llonginteger4
        Lunsigned longinteger4
        qlong longinteger8
        Qunsigned long longinteger8
        nssize_tinteger
        Nsize_tinteger
        e-7float2
        ffloatfloat4
        ddoublefloat8
        schar[]bytes
        pchar[]bytes
        Pvoid *integer

        為了同 C 語言中的結構體交換數據,還要考慮有的 C 或 C++ 編譯器使用了字節對齊,通常是以 4 個字節為單位的 32 位系統,故而 struct 根據本地機器字節順序轉換。可以用格式中的第一個字符來改變對齊方式,定義如下:

        CharacterByte orderSizeAlignment
        @nativenativenative
        =nativestandardnone
        <little-endianstandardnone
        >big-endianstandardnone
        !network (= big-endian)standardnone

        發送 WebSocket 報文代碼如下:

        def write_msg(message):
         data = struct.pack('B', 129) # 寫入第一個字節,10000001
         # 寫入包長度
         msg_len = len(message)
         if msg_len <= 125:
         data += struct.pack('B', msg_len)
         elif msg_len <= (2 ** 16 - 1):
         data += struct.pack('!BH', 126, msg_len)
         elif msg_len <= (2 ** 64 - 1):
         data += struct.pack('!BQ', 127, msg_len)
         else:
         logging.error('Message is too long!')
         return
         data += bytes(message, encoding='utf-8') # 寫入消息內容
         logging.debug(data)
         return data

        總結

        沒有其他能像 WebSocket 一樣實現全雙工傳輸的技術了,迄今為止,大部分開發者還是使用 Ajax 輪詢來實現,但這是個不太優雅的解決辦法,WebSocket 雖然用的人不多,可能是因為協議剛出來的時候有安全性的問題以及兼容的瀏覽器比較少,但現在都有解決。如果你有這些需求可以考慮使用 WebSocket:

      1. 多個用戶之間進行交互;

      2. 需要頻繁地向服務端請求更新數據。

      3. 比如彈幕、消息訂閱、多玩家游戲、協同編輯、股票基金實時報價、視頻會議、在線教育等需要高實時的場景。

        相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

        推薦閱讀:

        ES6實現全屏滾動插件步驟詳解

        Vue中watch使用方法總結

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

        文檔

        WebSocket通信使用剖析

        WebSocket通信使用剖析:這次給大家帶來WebSocket通信使用剖析,WebSocket通信使用剖析的注意事項有哪些,下面就是實戰案例,一起來看一下。什么是 WebSocket ?WebSocket 是一種標準協議,用于在客戶端和服務端之間進行雙向數據傳輸。但它跟 HTTP 沒什么關系,它是基于 TC
        推薦度:
        標簽: 通信 剖析 WebSocket
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费人成年轻人电影| 好男人看视频免费2019中文| 美女被吸屁股免费网站| 亚洲AV成人精品一区二区三区| 日本高清色本免费现在观看| 日韩电影免费在线| 国内精品久久久久影院亚洲| 黄色a三级三级三级免费看| 在线观看免费视频网站色| 最近2019年免费中文字幕高清 | 亚洲av无码不卡一区二区三区| 免费国产在线观看不卡| 色欲aⅴ亚洲情无码AV蜜桃| 免费一级毛片正在播放| 人妻仑刮八A级毛片免费看| 日本一区二区三区在线视频观看免费 | 亚洲三级在线观看| 天天看片天天爽_免费播放| 亚洲精品国产成人99久久| 日本亚洲高清乱码中文在线观看| 老司机福利在线免费观看| 亚洲精品视频免费| 精品亚洲一区二区三区在线观看 | 182tv免费视视频线路一二三| 国产精品99精品久久免费| 永久免费bbbbbb视频| 亚洲精品无码久久久| 久久久精品免费国产四虎| 毛片免费视频在线观看| 日本特黄特黄刺激大片免费| 国产亚洲精品仙踪林在线播放| 精品国产污污免费网站| 亚洲日本在线免费观看| 中文字幕成人免费高清在线 | 91高清免费国产自产拍2021| 亚洲日本久久一区二区va| 日韩人妻一区二区三区免费| 亚洲乱码国产乱码精品精| 全黄A免费一级毛片| 老司机亚洲精品影院| 最近免费中文字幕mv在线电影|