<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 22:15:30
        文檔

        WebSocket的通信過程與實現方法詳解

        WebSocket的通信過程與實現方法詳解:什么是 WebSocket ? WebSocket 是一種標準協議,用于在客戶端和服務端之間進行雙向數據傳輸。但它跟 HTTP 沒什么關系,它是基于 TCP 的一種獨立實現。 以前客戶端想知道服務端的處理進度,要不停地使用 Ajax 進行輪詢,讓瀏覽器隔個幾秒就向服務器發一次請
        推薦度:
        導讀WebSocket的通信過程與實現方法詳解:什么是 WebSocket ? WebSocket 是一種標準協議,用于在客戶端和服務端之間進行雙向數據傳輸。但它跟 HTTP 沒什么關系,它是基于 TCP 的一種獨立實現。 以前客戶端想知道服務端的處理進度,要不停地使用 Ajax 進行輪詢,讓瀏覽器隔個幾秒就向服務器發一次請

        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 中支持的格式如下表:

        Format C Type Python type Standard size
        x pad byte no value
        c char bytes of length 1 1
        b signed char integer 1
        B unsigned char integer 1
        ? _Bool bool 1
        h short integer 2
        H unsigned short integer 2
        i int integer 4
        I unsigned int integer 4
        l long integer 4
        L unsigned long integer 4
        q long long integer 8
        Q unsigned long long integer 8
        n ssize_t integer
        N size_t integer
        e -7 float 2
        f float float 4
        d double float 8
        s char[] bytes
        p char[] bytes
        P void * integer

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

        Character Byte order Size Alignment
        @ native native native
        = native standard none
        < little-endian standard none
        > big-endian standard none
        ! network (= big-endian) standard none

        發送 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. 比如彈幕、消息訂閱、多玩家游戲、協同編輯、股票基金實時報價、視頻會議、在線教育等需要高實時的場景。

        參考文章

        https://www.zhihu.com/question/20215561/answer/40316953

        http://fullstackpython.atjiang.com/websockets.html

        http://www.52im.net/thread-1341-1-1.html

        總結

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

        文檔

        WebSocket的通信過程與實現方法詳解

        WebSocket的通信過程與實現方法詳解:什么是 WebSocket ? WebSocket 是一種標準協議,用于在客戶端和服務端之間進行雙向數據傳輸。但它跟 HTTP 沒什么關系,它是基于 TCP 的一種獨立實現。 以前客戶端想知道服務端的處理進度,要不停地使用 Ajax 進行輪詢,讓瀏覽器隔個幾秒就向服務器發一次請
        推薦度:
        標簽: 實現 通信 傳輸
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久99久无码精品视频免费播放| 日本高清不卡中文字幕免费| 91精品国产免费| 亚洲国产美女精品久久久久∴| 一级做性色a爰片久久毛片免费| 免费一级毛片不卡不收费| 国产精品无码亚洲精品2021 | 黄页视频在线观看免费| 免费一级黄色毛片| 一级做a爰片久久毛片免费陪 | 亚洲国产综合精品中文第一区| 国产一级淫片a免费播放口| 亚洲国产精彩中文乱码AV| 久久香蕉国产线看免费| 亚洲第一页在线视频| 成年丰满熟妇午夜免费视频| 亚洲人成未满十八禁网站| 免费一级特黄特色大片在线观看| 九九99热免费最新版| 亚洲精品欧洲精品| 最新69国产成人精品免费视频动漫| 色网站在线免费观看| 亚洲AV无码久久精品蜜桃| 久久国产色AV免费看| 亚洲乱色熟女一区二区三区蜜臀| 亚洲成?Ⅴ人在线观看无码| 久久久久久av无码免费看大片| 亚洲熟妇av一区| 免费一级国产生活片| 国产免费爽爽视频在线观看| 亚洲国产精品综合久久网各| 日本xxwwxxww在线视频免费| 中文字幕在线成人免费看| 亚洲成年人免费网站| 伊人久久亚洲综合影院| 美女内射无套日韩免费播放| 国产成人人综合亚洲欧美丁香花| 亚洲性猛交XXXX| 四色在线精品免费观看| 伊人免费在线观看| 亚洲伊人久久大香线蕉AV|