<acronym id="indot"><dfn id="indot"></dfn></acronym>
<span id="indot"></span>

<bdo id="indot"><meter id="indot"></meter></bdo>
<label id="indot"><samp id="indot"></samp></label>
<label id="indot"><xmp id="indot">
  • <span id="indot"><table id="indot"></table></span>
    <center id="indot"><optgroup id="indot"></optgroup></center>
  • <bdo id="indot"><meter id="indot"></meter></bdo>
      當前位置:首頁 > javascript > nodejs > 正文內容

      nodejs websocket 發送protoBuf數據到服務端

      hxing6412年前 (2023-10-25)nodejs3883


      當使用Node.js進行WebSocket通信時,發送經過Protobuf編碼的數據到服務端是一個常見的需求。

      在這篇博客中,我們將通過一個示例來演示如何實現這個功能。

      假設我們有一個WebSocket服務端,地址為ws://example.com/ws

      我要發送pb_http_frame中的Request對象,這個對象中有body字段是來自pb_login中Req對象

      我們有以下兩個Protobuf定義文件,登錄時用到pb_login.Req,解析時用到pb_http_frame.Response(封裝返回的結果,有code、body):

      pb_login.proto:

      syntax = "proto3";
      message Req {
        int32 uid = 1;
        string client = 2;
        string platform = 3;
        string token = 4;
      }
      message Resp {
        // 定義Resp消息的字段
      }



      pb_http_frame.proto:

      syntax = "proto3";
      message Request {
        int32 cmd = 1;
        int32 sub = 2;
        int32 stt = 3;
        bytes body = 4;
      }
      message Response {
        int32 code = 1;
        bytes body = 2;
      }



      首先,我們需要安裝ws和protobufjs這兩個庫。你可以使用npm命令進行安裝:

      npm install ws protobufjs

      接下來,我們開始編寫代碼。首先,引入所需的庫和模塊:

      const WebSocket = require('ws');
      const protobuf = require('protobufjs');


      然后,創建WebSocket連接并加載Protobuf定義文件:

      const ws = new WebSocket('ws://example.com/ws');
      protobuf.load('protos/pb_login.proto', function (err, root) {
        if (err) throw err;
        const frameRoot = protobuf.loadSync('protos/pb_http_frame.proto');
        // 在這里編寫后續的代碼
      });



      在加載Protobuf定義文件后,我們可以獲取消息定義并創建消息對象:


      const ProtoLoginReq = root.lookupType('Req');
      const ProtoBuffFrameRequest = frameRoot.lookupType('Request');
      const ProtoBuffFrameResponse = frameRoot.lookupType('Response');
      const protoLoginReqPayload = {
        uid: 112000087,
        client: '4.3.02',
        platform: 'ios',
        token: '1F6BB53A6504904145CB38EEB57532DBB9FF5868F5A0FD61'
      };
      const protoLoginReqMessage = ProtoLoginReq.create(protoLoginReqPayload);
      const protoBuffFrameRequestPayload = {
        cmd: 1005,
        sub: 0,
        stt: 1,
        body: ProtoLoginReq.encode(protoLoginReqMessage).finish()
      };
      const protoBuffFrameRequestMessage = ProtoBuffFrameRequest.create(
        protoBuffFrameRequestPayload
      );


      接下來,我們需要將消息對象編碼為二進制數據,并發送到服務端:

      const buffer = ProtoBuffFrameRequest.encode(protoBuffFrameRequestMessage).finish();
      ws.on('open', () => {
        ws.send(new Uint8Array(buffer));
      });



      在WebSocket連接打開后,我們使用ws.send方法發送經過編碼的數據。

      最后,我們監聽服務端返回的消息,并進行解碼和處理:

      ws.on('message', data => {
        const decodeData = ProtoBuffFrameResponse.decode(data);
        console.log('接收到數據------------', JSON.stringify(decodeData));
        // 在這里進行解碼后的數據處理
      });



      在這個例子中,我們使用ProtoBuffFrameResponse.decode方法對服務端返回的數據進行解碼,并根據解碼后的結果進行相應的處理。

      通過這個示例,你可以學習如何使用Node.js與WebSocket服務端進行通信,并發送經過Protobuf編碼的數據。


      完整代碼如下:


      const WebSocket = require('ws');
      const protobuf = require('protobufjs');
      const ws = new WebSocket('ws://example.com/ws');
      protobuf.load('protos/pb_login.proto', function (err, root) {
        if (err) throw err;
        const frameRoot = protobuf.loadSync('protos/pb_http_frame.proto');
        const ProtoLoginReq = root.lookupType('Req');
        const ProtoBuffFrameRequest = frameRoot.lookupType('Request');
        const ProtoBuffFrameResponse = frameRoot.lookupType('Response');
        const protoLoginReqPayload = {
          uid: 112000087,
          client: '4.3.02',
          platform: 'ios',
          token: '1F6BB53A6504904145CB38EEB57532DBB9FF5868F5A0FD61'
        };
        const protoLoginReqMessage = ProtoLoginReq.create(protoLoginReqPayload);
        const protoBuffFrameRequestPayload = {
          cmd: 1005,
          sub: 0,
          stt: 1,
          body: ProtoLoginReq.encode(protoLoginReqMessage).finish()
        };
        const protoBuffFrameRequestMessage = ProtoBuffFrameRequest.create(
          protoBuffFrameRequestPayload
        );
        const buffer = ProtoBuffFrameRequest.encode(protoBuffFrameRequestMessage).finish();
        ws.on('open', () => {
          ws.send(new Uint8Array(buffer));
        });
        ws.on('message', data => {
          const decodeData = ProtoBuffFrameResponse.decode(data);
          console.log('接收到數據------------', JSON.stringify(decodeData));
          // 在這里進行解碼后的數據處理
        });
      });





      掃描二維碼推送至手機訪問。

      版權聲明:本文由星星博客發布,如需轉載請注明出處。

      本文鏈接:http://www.7811333.com/?id=426

      分享給朋友:

      “nodejs websocket 發送protoBuf數據到服務端” 的相關文章

      nodejs 解壓文件,當文件名為中文名時會出現亂碼

      一開始我是使用compressing 去解壓的,后面一直出現亂碼,于是換了個解壓的包 yauzl 具體實現步驟:安裝npm install yauzl   2. 封裝了個解壓文件方法function unzip(zipFileName, output...

      Nodejs 定時任務(node-schedule)

      安裝:npm install node-schedule Cron風格定時器var schedule = require('node-schedule'); function scheduleCronstyl...

      Node.js初階之Express

      Node.js是一種基于事件驅動和非阻塞I/O模型的JavaScript運行環境,它非常適合構建高性能的網絡應用程序。在Node.js生態系統中,Express是最受歡迎的Web應用程序框架之一。本文將介紹Node.js初階中的Express框架,并提供一些實例來幫助你入門。什么是ExpressEx...

      Node.js中的并發編程:利用事件循環實現高效多任務處理

      在Node.js中,利用事件驅動的非阻塞I/O模型,我們可以輕松地實現并發編程,高效地處理多個任務。本文將介紹Node.js中的并發編程概念、常用的實現方式以及相關代碼示例,并總結如何通過事件循環來實現高效的多任務處理。 一、并發編程概念...

      深入理解Node.js進程管理

      在Node.js中,進程管理是一個非常重要的話題,它涉及到如何創建、控制和監測進程,以及如何利用多核處理器。本文將深入探討Node.js中的進程管理,并通過詳細的代碼示例幫助讀者更好地理解。 1. 什么是進程? 首先,讓我們了解一下...

      nodejs 文件操作類的封裝

      最近做node項目,操作文件特別不方便,于是封裝了工具類挺好用的,分享給大家 const fs = require('fs') const path = require('path') /** &nb...

      發表評論

      訪客

      ◎歡迎參與討論,請在這里發表您的看法和觀點。
      主站蜘蛛池模板: 亚洲国产天堂久久综合| 韩国亚洲伊人久久综合影院| 久久婷婷午色综合夜啪| 97久久久精品综合88久久| 天天综合天天综合色在线| 国产精品综合一区二区三区| 狠狠做深爱婷婷综合一区| 亚洲一本综合久久| 精品国产天堂综合一区在线| 狠狠人妻久久久久久综合| 久久综合九色综合网站| 亚洲AV日韩综合一区| 久久久久综合网久久| 伊人久久久大香线蕉综合直播| 国产成人亚洲综合无码| 伊人yinren6综合网色狠狠| 综合人妻久久一区二区精品| 一本久道久久综合狠狠躁| 香蕉国产综合久久猫咪| 久久精品桃花综合| 色噜噜综合亚洲av中文无码| 国产精品综合久成人| 一本色道久久综合无码人妻 | 伊人一伊人色综合网| 久久精品桃花综合| 亚洲五月综合网色九月色| 亚洲欧洲日产国产综合网| 狠狠色狠狠色综合日日不卡| 狠狠色噜噜狠狠狠狠色综合久| 涩涩色中文综合亚洲| 亚洲综合激情九月婷婷 | 亚洲国产综合精品一区在线播放| 亚洲精品第一国产综合精品| 久久香综合精品久久伊人| 亚洲av日韩综合一区在线观看| 久久伊人久久亚洲综合| 亚洲综合一区国产精品| 丁香五月缴情综合网| 亚洲狠狠婷婷综合久久久久| 久久精品亚洲综合| 国产综合无码一区二区色蜜蜜|