找回密码
 立即注册
查看: 253|回复: 0

JS+WebSocket+Protobuf的客户端代码实现

[复制链接]
发表于 2022-7-7 18:49 | 显示全部楼层 |阅读模式
背景

服务端WebSocket + Protobuf + 大报头(Big-Endian)
客户端Web环境,JS实现WS对接
生成JS版本的Proto

在放置proto的目录下执行
protoc --js_out=import_style=commonjs:./ --plugin=protoc-gen-grpc=./protoc-gen-grpc-web.exe --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./ *.proto
说明:
    protoc-gen-grpc-web.exe需要去官方下载最新版本服务端需要另外提供一套msg_id的对应js文件
Web客户端安装google-protobuf依赖

npm install google-protobuf --save客户端需要的文件


image.png

连接WS

let wsUri = "ws://127.0.0.1:3658/"let ws = new WebSocket(wsUri)ws.binaryType = "arraybuffer" //proto通讯一定要用这个配置消息发送函数

function doSend(msgID, bytes) {    var buffer = new ArrayBuffer(bytes.length + 2); // 前两位留给msgID    var view = new DataView(buffer);    view.setUint16(0, msgID);    for (var i = 0; i < bytes.length; i++) {        view.setUint8(i + 2, bytes);    }    ws.send(view);}以登录举例

let loginMsg = new login_msg.RequestLogin()loginMsg.setToken("6f35691ccb516ee6c15f1da4427c8d7a")doSend(login_msg_id.proto_msg.RequestLogin, loginMsg.serializeBinary())接受消息

function onMessage(evt) {  let ret = loadMsg(evt.data)}function loadMsg(data) {  const msgId = view.getUint16(0) // 前两个byte是MessagID  const msgName = msgDefine.msg_map[msgId]  const protoMsg = proto[msgName]  const ret = protoMsg.deserializeBinary(data)  return protoMsg.toObject(false, ret)}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-25 23:26 , Processed in 0.134018 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表