module.exports = {"nested": {"wenlipackage": {"nested": {"Header": {"fields": { ... } },"Frame": {"fields": { ... } } } } }}
- 采用Protobuf库编/解码数据
// 引入protobuf模块import * as protobuf from './weichatPb/protobuf'; // 加载awesome.proto对应的jsonimport awesomeConfig from './awesome.js'; // 加载JSON descriptorconst AwesomeRoot = protobuf.Root.fromJSON(awesomeConfig);// Message类,.proto文件中定义了Frame是消息主体const AwesomeMessage = AwesomeRoot.lookupType("Frame");const payload = {test: "123"};const message = AwesomeMessage.create(payload);const array = AwesomeMessage.encode(message).finish();// unit8Array => ArrayBufferconst enMessage = array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset)console.log("encodeMessage", enMessage);// buffer 表示通过小程序this.socketTask.onMessage((msg) => {});接收到的数据const deMessage = AwesomeMessage.decode(new Uint8Array(buffer));console.log("decodeMessage", deMessage);消息通信一个?websocket?实例的生成需要经过以下步骤:
- 建立连接
- 建立连接后会返回一个websoket实例
- 连接打开
- 连接建立->连接打开是一个异步的过程,在这段时间内是监听不到消息,更是无法发送消息的
- 监听消息
- 监听的时机比较关键,只有当连接建立并生成websocket实例后才能监听
- 发送消息
- 发送当时机也很关键,只有当连接真正打开后才能发送消息
- 封装websocket类
export default class websocket {constructor({ heartCheck, isReconnection }) {this.socketTask = null;// websocket实例this._isLogin = false;// 是否连接this._netWork = true;// 当前网络状态this._isClosed = false;// 是否人为退出this._timeout = 10000;// 心跳检测频率this._timeoutObj = null;this._connectNum = 0;// 当前重连次数this._reConnectTimer = null;this._heartCheck = heartCheck;// 心跳检测和断线重连开关,true为启用,false为关闭this._isReconnection = isReconnection; } _reset() {}// 心跳重置_start() {} // 心跳开始 onSocketClosed(options) {} // 监听websocket连接关闭 onSocketError(options) {} // 监听websocket连接关闭 onNetworkChange(options) {} // 检测网络变化 _onSocketOpened() {} // 监听websocket连接打开 onReceivedMsg(callBack) {} // 接收服务器返回的消息 initWebSocket(options) {} // 建立websocket连接 sendWebSocketMsg(options) {} // 发送websocket消息 _reConnect(options) {} // 重连方法,会根据时间频率越来越慢 closeWebSocket(){} // 关闭websocket连接} - 多个page使用同一个?websocket?对象
methods: { ...mapMutations(['changeGlobalWebsocket']), linkWebsocket(websocketUrl) {// 建立连接this.websocket.initWebSocket({ url: websocketUrl,success(res) { console.log('连接建立成功', res) },fail(err) { console.log('连接建立失败', err) },complate: (res) => {this.changeGlobalWebsocket(res); } }) }}- 通过WebSocket类建立连接,将tt.connectSocket返回的websocket实例透传出来,全局共享 。
computed: { ...mapState(['globalWebsocket']), newGlobalWebsocket() {// 只有当连接建立并生成websocket实例后才能监听if (this.globalWebsocket && this.globalWebsocket.socketTask) {if (!this.hasListen) {this.globalWebsocket.onReceivedMsg((res, data) => {// 处理服务端发来的各类消息this.handleServiceMsg(res, data); });this.hasListen = true; }if (this.globalWebsocket.socketTask.readyState === 1) {// 当连接真正打开后才能发送消息 } }return this.globalWebsocket; },},watch: { newGlobalWebsocket(newVal, oldVal) {if(oldVal && newVal.socketTask && newVal.socketTask !== oldVal.socketTask) {// 重新监听this.globalWebsocket.onReceivedMsg((res, data) => {this.handleServiceMsg(res, data); }); } }, },
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 安化黑茶小孩可以喝吗,安化黑茶
- 如何治疗痔疮的小窍门
- 五谷当中的黍和稷 五谷是哪五谷黍
- 长安汽车|国民出行精品车 长安LUMIN来了 小姐姐代步最爱
- 东亚四小龙崛起原因分析 亚洲四小龙发展的主要原因
- 老人小肚子鼓着硬硬的
- 洗衣机什么程序洗衣服最干净?
- 唐代边关诗人 宋代边塞诗代表
- 征途手机版击杀小于自己多少级的BOSS无法获得道具掉落答案
- 周娥皇的妹妹是谁 周娥皇到底喜欢谁
