当前位置:首页 > javascript > nodejs > 正文内容

nodejs websocket 发送protoBuf数据到服务端

hxing64111个月前 (10-25)nodejs3324


当使用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://xingxinghan.cn/?id=426

分享给朋友:

“nodejs websocket 发送protoBuf数据到服务端” 的相关文章

mongodb数据备份和读取

下载mongodb数据工具,https://www.mongodb.com/try/download/database-tools,解压到目录中用命令行进入此目录,使用mongodump命令生成备份文件,例如备份本地test数据库到d:\db目录, 在db目录会生成一个test文件夹: mongod...

Nodejs 定时任务(node-schedule)

安装:npm install node-schedule Cron风格定时器var schedule = require('node-schedule'); function scheduleCronstyl...

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...

npm安装时报错,出现 certificate has expired

最近使用npm安装工具屡屡报错,大致显示为:npm ERR! request to https://registry.npm.taobao.org/cnpm failed, reason: certificate has expired.从报错信息就可以知道是因为你之前设置的淘宝镜像已过期,解决方法...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。