之前开发微信小游戏 用到了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 ,欢迎入群导论技术问题