<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
        主站蜘蛛池模板: 亚洲人午夜射精精品日韩| 扒开双腿猛进入爽爽免费视频 | 亚洲av无码电影网| 最近最好最新2019中文字幕免费 | 亚洲精品成人久久| 114级毛片免费观看| 亚洲成aⅴ人片在线观| 国产电影午夜成年免费视频| 亚洲第一区视频在线观看| www视频免费看| 亚洲 欧洲 视频 伦小说| 在线播放免费播放av片| 国产亚洲人成在线影院| 亚洲乱码中文字幕综合234| 国产无遮挡色视频免费观看性色 | 亚洲午夜电影在线观看高清| 国产成人免费高清激情明星| 亚洲一卡2卡三卡4卡无卡下载 | 亚洲成aⅴ人片在线影院八| 成人无码区免费A片视频WWW | 亚洲欧洲免费无码| av无码东京热亚洲男人的天堂| 一个人免费观看日本www视频| 亚洲AV永久青草无码精品| www视频在线观看免费| 羞羞视频网站免费入口| 综合亚洲伊人午夜网 | 国产精品自在自线免费观看| 一个人免费播放在线视频看片| 亚洲AV日韩AV天堂一区二区三区| 亚洲一区在线免费观看| 国产精品亚洲小说专区| 亚洲成AV人片在WWW色猫咪| 一色屋成人免费精品网站| 特级毛片全部免费播放| 亚洲AV日韩AV永久无码下载| 成人午夜性A级毛片免费| eeuss免费天堂影院| 亚洲国产品综合人成综合网站| 亚洲AV伊人久久青青草原| 在线观看的免费网站无遮挡|