WebSocket草案10文字資料解析和傳送

2021-09-01 06:06:40 字數 3206 閱讀 4339

握手協議實現了,接下來就是解析資料了,這個相對來說要麻煩很多,相比草案7.6變得更複雜了。下圖是資料傳輸的格式:

各個值的具體含義可以參考這個中文翻譯:英文原文在這裡:

簡單概括一下就是:fin一直為1,rsv1、rsv2、rsv3一直為0,當傳送內容為文字時,opcode為1,mask如果為1就使用掩碼,需要獲取四位掩碼,依次輪流和資料做異或運算,第乙個內容資料與第乙個掩碼異或,第二個內容資料與第二個掩碼異或……第五個內容資料與第乙個掩碼異或……一直到結束,然後再對內容進行編碼就可以了。

在chrome/firefox下面,fin永遠為1,如果只是文字訊息,opcode一直是1,rsv1、rsv2、rsv3都為0,所以第乙個資料是0×81;mask為1,再跟上資料長度,所以第二個資料會大於0×80,由於資料長度不一樣,其需要占用的位元組數也不一樣,因此掩碼的位置也不一樣。根據規範,換算下來是這樣:資料總長度(包含fin、rsv等等資訊)小於0×84,則掩碼為第三個資料到第六個資料;資料總長度(包含fin、rsv等等資訊)小於0xfe81,則掩碼為第五個資料到第八個資料;其他掩碼則為第十三個資料到第十六個資料。當資料長度超過乙個包的長度時,後面的資料報不再包含rin、rsv和mask等資訊,二是直接為內容資料,需要根據上一次取到的mask來做異或運算。在客戶端主動要求斷開鏈結時,會沒有內容資料,只有頭資訊和掩碼,長度固定為6,為了避免混淆,chrome會保證正常內容傳送時不會出現6位元組的資料,基本上可以把6位元組當斷開連線請求處理。區分客戶端主動要求斷開連線和正常的連續資料報要根據長度區分:如果是連續的資料報,則已解析的包的長度會小於首包頭資訊裡的長度,否則則認為是客戶端主動要求斷開鏈結。主動斷開連線時會傳送的乙個額外的資料報,此時第乙個位元組不會為正常的0×81,通常為0×88,nodejs寫出來大致是這樣的:

module

.exports

=parser

;var

util

=require

('util'

),events

=require

('events'

);/**

* http.server 資料解析類

* */

function

parser

(version

)util

.inherits

(parser

,events

.eventemitter

);parser

.prototype

.write

=function

(data);

// 資料解析工具

vardataparser

=// 草案10

// 首包會包含掩碼資訊if(

data[0

]==0x81

)console

.log

('firefox multi packages, length: '

,parser

.length

);start

=data

.length;}

else

}elseif(

data

.length

<

0xfe80

)else

console

.log

('7 + 64bit, length: '

,parser

.length

);parser

.maskdata =[

data[12

],data[13

],data[14

],data[15

]];start =16

;}for(i =

start

,len

=data

.length;i

<

len;

i++)

}else

elseif(

data

.length

<

0xfe81

)else

// find contents

parser

.framedata

=data

.splice

(start);}

console

.log

('1st packge frame length: '

,parser

.framedata

.length

);if

(parser

.framedata

.length

==parser

.length

)return;}

// 連續的資料報if(

parser

.maskdata

.length

)console

.log

('frame length: '

,parser

.framedata

.length

);if

(parser

.framedata

.length

==parser

.length

)return;}

}};**:

在draft 10中,如果解析資料的過程弄清楚了,這個就更簡單了,返回資料的格式和之前接受到的資料格式非常類似,只是你不用生成mask了,頭部的其他格式還是一模一樣的。

第乙個位元組還是固定的,是0×81,意義和接受資料的意義一樣,第二個位元組也是,後七個位表示資料長度,由於沒有mask,所以第一位是0;長度的表示方法和接受的標識方法一致,可能用7位表示,也可能用16位表示。

用nodejs實現如下:

var

socketwriter

=elseif(

socket

.writable

)return

false;},

'draft76'

:function

(socket

,data)};

socketwriter

['draft75']=

socketwriter

['draft76'

]; **:

Windows10 yolov3 文字檢測

yolov3 文字檢測 windows 環境搭建 gpu版 1.cuda9.1 2.cudnn7.0.5 3.vs2015 安裝,預設省去很多麻煩 4.opencv3.4.0 安裝,參照下面附加依賴庫路徑,不同則修改附加依賴庫 vs編譯 1.release x64 2.opencv附加依賴庫 本地o...

5文字溢位

文字溢位 overflow visible 預設值 hidden 超出隱藏 scroll 顯示滾動條 auto 自適應檢視 inherit 繼承父元素overflow值文字換行 white space normal 預設值 pre 原格式輸出,空白會被瀏覽器保留 pre wrap 文字不會換行,文字...

336 文字壓縮

中文english 給你乙個只含有可見字元 ascii 碼範圍 3232 至 126126 文字檔案,檔案中可能出現一些重複的單詞,你需要對它們進行壓縮。壓縮規則如下 如果原檔案中的字元不是英文本元,那麼保留這些字元。我們將連續的英文本元視為乙個單詞,單詞的前後不應該還有其它的英文本元。輸入 ple...