发个处理socket粘包、分包的方法~求前辈们指点下~
对JS的API还是不太熟悉,第一次写求各位指点指点
function exPackag(aCallback)
{
this.mBuffer=new Array();//缓冲容器
this.mBuffer_len=0;//协议长度
this.mData_len_Median=2;//协议的长度所占的位数
this.mCallback=aCallback;//回调函数
}
exPackag.prototype.putData=function(aData)
{
if(this.mBuffer_len==0)
{
if(aData.length<this.mData_len_Median)
{
console.log('包头不全直接忽略');
return;//包头不全直接忽略
}else{
this.mBuffer_len=getIntToByte16(aData)+this.mData_len_Median;
}
}
for(var index=0; index<aData.length; index++) {
this.mBuffer.push(aData[index]);
}
while (true)
{
/** 如果缓存中的长度刚好是一个包的长度*/
if(this.mBuffer.length==this.mBuffer_len){
this.mCallback(this.mBuffer);
this.mBuffer=null;
this.mBuffer=new Array();
this.mBuffer_len=0;
return;
}
/** 如果缓存中的长度大于一个包的长度*/
else if (this.mBuffer.length>this.mBuffer_len){
/** 先获取一个完整的包*/
var tBuffer=this.mBuffer.splice(0,this.mBuffer_len);
this.mCallback(tBuffer);
tBuffer=null;
if(this.mBuffer.length>=this.mData_len_Median)
{
this.mBuffer_len=getIntToByte16(this.mBuffer)+this.mData_len_Median;
}
}else{
/** 不满足长度*/
console.log('长度不符合退出');
return;
}
}
}
function getIntToByte16(aRecv){
var targets= (aRecv[0] & 0xff)| ((aRecv[1]<<8) & 0xff00);
return targets;
}
exports.exPackag = exPackag;
/*******************使用***********************************/
var mPackageSystem=require('../shared/packageSystem');
var tBuffer=new mPackageSystem.exPackag(onReceivePackData);
sock.on('data', function(data) {
tBuffer.putData(data);
});
/** 一个完整的包*/
function onReceivePackData(aBuffer)
{
console.log(aBuffer);
}
1 回复
…