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)); // 在這里進行解碼后的數據處理 }); });