websocket ArrayBuffer使用整理回顾

之前开发微信小游戏 用到了websocket 由于在微信平台 直接用wx提供的方法是最便捷的
代码如下

var sot = {
    isOpen: false,
    connect: function (address){//, call) {
        //建立连接
       // let url = 'ws://' + address + "/chatServer/{"+theGame.userId+"}"
        let url = 'wss://'.concat(address).concat('/chatServer/').concat(theGame.userId).concat("")
        //url = encodeURI(url)
        console.log("url->"+url)
        wx.connectSocket({
            url: url,
            header: { Cookie: wx.getStorageSync('Cookie') },
        })
        //连接成功
        wx.onSocketOpen(function () {
            console.log("【连接成功】")
            sot.isOpen = true
            let data = {}
            data.userId = theGame.userId
        })
        //连接失败
        wx.onSocketError(function (res) {
            sot.isOpen = false
            console.log("连接失败",res)
            setTimeout(function () {
                wx.connectSocket({
                    url: url,
                    header: { Cookie: wx.getStorageSync('Cookie') },
                })
            }.bind(this), 4000);
            
            console.log('[onSocketError]');
        })
        //连接关闭
        wx.onSocketClose(function(){
            console.log("连接关闭"+url)
            sot.isOpen = false
            setTimeout(function () {
                wx.connectSocket({
                    url: url,
                    header: { Cookie: wx.getStorageSync('Cookie') },
                })
            }.bind(this), 4000);
        //    let noteLab = {}
        //    noteLab.lab = '重新连接中...'
        //    cc.director.emit("addANote",noteLab)

            console.log('[onSocketClose]');

        })

       
    },

断线重连那里最好改成重连x次后停止连接尝试,这是后来想到的,然后是arryBuf的部分
和服务器商议用消息的前四个字节代表协议号 首先创建buf

var buf = new ArrayBuffer(4);
            var bufView = new DataView(buf);
            bufView.setInt32(0, subCmdID);

如果没有其他内容 就可以直接使用 wx的sendSocketMessage方法发送协议了,带其他内容需要针对不同了类型做个转化:

let pos = 4 
        let len = sot.getSubLen(sObj,data)
        var buf = new ArrayBuffer(len);
        var bufView = new DataView(buf);
        bufView.setInt32(0, subCmdID);
        for(let i=0;i<sObj.length;i++){
            if("STRING" == sObj[i][0]){
                var sBf = theGame.encodeUTF8(data[sObj[i][1]]);
                var uIdView = new DataView(sBf);
                bufView.setInt16(4, sBf.byteLength);
                pos+=2
                for(let j = 0 ;j<uIdView.byteLength;j++){
                    bufView.setUint8(j+pos,uIdView.getUint8(j))
                }
                pos+=uIdView.byteLength
            }else if("INT" == sObj[i][0]){
                bufView.setInt32(pos, data[sObj[i][1]]);
                pos+=4
            }
        }

这里从第四个字节后开始进行编码 需要将string 和int转化成二进制数据
辅助方法

getSubLen:function(sObj,data){
        let len = 4
        for(let i=0;i<sObj.length;i++){
            if("STRING" == sObj[i][0]){
                len += data[sObj[i][1]].length*1.2+2
            }else if("INT" == sObj[i][0]){
                len += 4
            }
        }
        return len
    },

如果是json就比较简单了
直接 用
JSON.stringify
JSON.parse
方法就可以了。

协议结构定义:
SUB_S_ 代表服务器发送
SUB_C_ 表示客户端发送
CMD_S 和CMD_C同理
比如:

SUB_S_Chat:4001,	//战斗房间
	CMD_C_Chat:[
		["JSON","message"]
	],
	

北上杭码农聚集地 qq群号:199678137 ,欢迎入群导论技术问题

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值