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

nodejs websocket 发送protoBuf数据到服务端

hxing6411年前 (2023-10-25)nodejs3620


当使用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:

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



pb_http_frame.proto:

JavaScript
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命令进行安装:

Bash
npm install ws protobufjs

接下来,我们开始编写代码。首先,引入所需的库和模块:

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

然后,创建WebSocket连接并加载Protobuf定义文件:

JavaScript
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定义文件后,我们可以获取消息定义并创建消息对象:

JavaScript
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
);


接下来,我们需要将消息对象编码为二进制数据,并发送到服务端:

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


在WebSocket连接打开后,我们使用ws.send方法发送经过编码的数据。

最后,我们监听服务端返回的消息,并进行解码和处理:

JavaScript
ws.on('message', data => {
  const decodeData = ProtoBuffFrameResponse.decode(data);
  console.log('接收到数据------------', JSON.stringify(decodeData));
  // 在这里进行解码后的数据处理
});


在这个例子中,我们使用ProtoBuffFrameResponse.decode方法对服务端返回的数据进行解码,并根据解码后的结果进行相应的处理。

通过这个示例,你可以学习如何使用Node.js与WebSocket服务端进行通信,并发送经过Protobuf编码的数据。


完整代码如下:

JavaScript
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));
    // 在这里进行解码后的数据处理
  });
});




扫描二维码推送至手机访问。

版权声明:本文由星星博客发布,如需转载请注明出处。

本文链接:https://xingxinghan.cn/?id=426

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

mongodb数据备份和读取

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

Node.js初阶之Express

Node.js是一种基于事件驱动和非阻塞I/O模型的JavaScript运行环境,它非常适合构建高性能的网络应用程序。在Node.js生态系统中,Express是最受欢迎的Web应用程序框架之一。本文将介绍Node.js初阶中的Express框架,并提供一些实例来帮助你入门。什么是ExpressEx...

构建Node.js Web 应用:使用Express、EJS 和 Mongoose

在本篇博客文章中,我们将介绍如何使用Node.js的Express框架、EJS模板引擎和Mongoose库来构建一个简单的Web应用实例。通过代码示例和详细解释,帮助读者了解如何结合这些工具来构建一个完整的Node.js Web 应用。1. 准备工作首先,确保你已经安装了Node.js和npm(No...

深入理解 Node.js 开发中的 Express 路由与中间件

在 Node.js 开发中,Express 是一个非常流行的框架,它提供了一种简洁而灵活的方式来构建 Web 应用程序。在 Express 中,路由和中间件是两个核心概念,它们在开发过程中起着重要的作用。本文将深入探讨 Express 路由和中间件的概念、使用方法以及...

Node.js中的并发编程:利用事件循环实现高效多任务处理

在Node.js中,利用事件驱动的非阻塞I/O模型,我们可以轻松地实现并发编程,高效地处理多个任务。本文将介绍Node.js中的并发编程概念、常用的实现方式以及相关代码示例,并总结如何通过事件循环来实现高效的多任务处理。 一、并发编程概念...

发表评论

访客

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