发个处理socket粘包、分包的方法~求前辈们指点下~
发布于 12 年前 作者 beiyio 7004 次浏览 最后一次编辑是 8 年前

对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 回复
回到顶部