JS+WebSocket+Protobuf的客戶端代碼實(shí)現(xiàn)

背景

服務(wù)端WebSocket + Protobuf + 大報(bào)頭(Big-Endian)
客戶端Web環(huán)境偿荷,JS實(shí)現(xiàn)WS對(duì)接

生成JS版本的Proto

在放置proto的目錄下執(zhí)行

protoc --js_out=import_style=commonjs:./ --plugin=protoc-gen-grpc=./protoc-gen-grpc-web.exe --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./ *.proto

說明:

  1. protoc-gen-grpc-web.exe需要去官方下載最新版本
  2. 服務(wù)端需要另外提供一套msg_id的對(duì)應(yīng)js文件

Web客戶端安裝google-protobuf依賴

npm install google-protobuf --save

客戶端需要的文件

image.png

連接WS

let wsUri = "ws://127.0.0.1:3658/"
let ws = new WebSocket(wsUri)
ws.binaryType = "arraybuffer" //proto通訊一定要用這個(gè)配置

消息發(fā)送函數(shù)

function doSend(msgID, bytes) {
    var buffer = new ArrayBuffer(bytes.length + 2); // 前兩位留給msgID
    var view = new DataView(buffer);
    view.setUint16(0, msgID);
    for (var i = 0; i < bytes.length; i++) {
        view.setUint8(i + 2, bytes[i]);
    }
    ws.send(view);
}

以登錄舉例

let loginMsg = new login_msg.RequestLogin()
loginMsg.setToken("6f35691ccb516ee6c15f1da4427c8d7a")
doSend(login_msg_id.proto_msg.RequestLogin, loginMsg.serializeBinary())

接受消息

function onMessage(evt) {
  let ret = loadMsg(evt.data)
}

function loadMsg(data) {
  const msgId = view.getUint16(0) // 前兩個(gè)byte是MessagID
  const msgName = msgDefine.msg_map[msgId]
  const protoMsg = proto[msgName]
  const ret = protoMsg.deserializeBinary(data)
  return protoMsg.toObject(false, ret)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逛薇,一起剝皮案震驚了整個(gè)濱河市溉跃,隨后出現(xiàn)的幾起案子匙奴,更是在濱河造成了極大的恐慌姊舵,老刑警劉巖勤揩,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帝火,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡风罩,警方通過查閱死者的電腦和手機(jī)糠排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來超升,“玉大人入宦,你說我怎么就攤上這事∈易粒” “怎么了乾闰?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盈滴。 經(jīng)常有香客問我涯肩,道長(zhǎng),這世上最難降的妖魔是什么巢钓? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任病苗,我火速辦了婚禮,結(jié)果婚禮上症汹,老公的妹妹穿的比我還像新娘硫朦。我一直安慰自己,他們只是感情好烈菌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布阵幸。 她就那樣靜靜地躺著花履,像睡著了一般芽世。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诡壁,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天济瓢,我揣著相機(jī)與錄音,去河邊找鬼妹卿。 笑死旺矾,一個(gè)胖子當(dāng)著我的面吹牛蔑鹦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箕宙,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼嚎朽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了柬帕?” 一聲冷哼從身側(cè)響起哟忍,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陷寝,沒想到半個(gè)月后锅很,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凤跑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年爆安,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仔引。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扔仓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咖耘,到底是詐尸還是另有隱情当辐,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布鲤看,位于F島的核電站缘揪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏义桂。R本人自食惡果不足惜找筝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慷吊。 院中可真熱鬧袖裕,春花似錦、人聲如沸溉瓶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)堰酿。三九已至疾宏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間触创,已是汗流浹背坎藐。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岩馍。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓碉咆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛀恩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疫铜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容