发个处理socket粘包、分包的方法~求前辈们指点下~
发布于 2年前 作者 beiyio 1162 次浏览

对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);
}
回到顶部