nodejs websocket 发送protoBuf数据到服务端
当使用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)); // 在这里进行解码后的数据处理 }); });