国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

WebSocket通信使用剖析

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 19:49:12
文檔

WebSocket通信使用剖析

WebSocket通信使用剖析:這次給大家?guī)鞼ebSocket通信使用剖析,WebSocket通信使用剖析的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。什么是 WebSocket ?WebSocket 是一種標準協(xié)議,用于在客戶端和服務(wù)端之間進行雙向數(shù)據(jù)傳輸。但它跟 HTTP 沒什么關(guān)系,它是基于 TC
推薦度:
導(dǎo)讀WebSocket通信使用剖析:這次給大家?guī)鞼ebSocket通信使用剖析,WebSocket通信使用剖析的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。什么是 WebSocket ?WebSocket 是一種標準協(xié)議,用于在客戶端和服務(wù)端之間進行雙向數(shù)據(jù)傳輸。但它跟 HTTP 沒什么關(guān)系,它是基于 TC

RSV1, RSV2, RSV3:各占 1bit

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

Opcode: 4bit

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

Mask: 1bit

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

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

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

Masking-key: 0 or 4bytes

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

Payload Data: 載荷數(shù)據(jù)

解析 WebSocket 報文代碼如下:

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

服務(wù)端發(fā)送 WebSocket 報文

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

struct 模塊解析

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

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

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 語言中的結(jié)構(gòu)體交換數(shù)據(jù),還要考慮有的 C 或 C++ 編譯器使用了字節(jié)對齊,通常是以 4 個字節(jié)為單位的 32 位系統(tǒng),故而 struct 根據(jù)本地機器字節(jié)順序轉(zhuǎn)換。可以用格式中的第一個字符來改變對齊方式,定義如下:

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

發(fā)送 WebSocket 報文代碼如下:

def write_msg(message):
 data = struct.pack('B', 129) # 寫入第一個字節(jié),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') # 寫入消息內(nèi)容
 logging.debug(data)
 return data

總結(jié)

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

  • 多個用戶之間進行交互;

  • 需要頻繁地向服務(wù)端請求更新數(shù)據(jù)。

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

    相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注Gxl網(wǎng)其它相關(guān)文章!

    推薦閱讀:

    ES6實現(xiàn)全屏滾動插件步驟詳解

    Vue中watch使用方法總結(jié)

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

    文檔

    WebSocket通信使用剖析

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲免费久久 | 国模私拍一区二区 | 日产精品一区二区三区免费 | 色综合久久中文字幕综合网 | 亚洲第一页在线视频 | 亚洲国产精品综合久久一线 | 色精品一区二区三区 | 日本美女一区二区 | 日韩国产免费一区二区三区 | 欧美综合图区亚洲综合图区 | 国产亚洲一区二区三区在线观看 | 久久精品国产一区二区三区 | www日韩| 在线播放国产一区二区三区 | 久久精品免费观看 | h片在线播放| 久久精品一区 | 国产精品麻豆a在线播放 | 成人欧美一区二区三区黑人 | 欧美日韩视频一区三区二区 | 在线观看免费精品国自产 | 久久精品123 | 亚洲精品一二三四区 | 国产精品亚洲精品观看不卡 | 欧美a一| 欧美综合在线视频 | 全免费a级毛片免费毛视频 热re91久久精品国产91热 | 欧美亚洲综合另类 | 欧洲色图亚洲色图 | 欧美午夜在线观看 | 国产日产精品_国产精品毛片 | 国产原创一区二区 | 久久久久久久久久久9精品视频 | 日韩美女一区二区三区 | 久久精品国产999久久久 | 国产成人精品一区二区免费视频 | 久久频道毛片免费不卡片 | 国产一区二区三区免费在线观看 | 国产福利一区二区三区在线视频 | 四虎影院永久免费观看 | 欧美日韩亚洲区久久综合 |