8.7w+
社区成员
function createServer(){
var server = net.createServer(function(client){
console.log('client connected');
client.write('connected');
client.on('data', function(data){
//接收数据 并根据数据内容进行处理
console.log(data.length);
dataProcess(data);
});
client.on('error', function(err){
});
client.on('end', function(){
//会话终止
});
});
server.listen(port, function(){
});
}
client.on('end', function(data){
//会话终止
console,log(data.length);
});
你试过这样写吗?
client.on('data', function(data){
//接收数据 并根据数据内容进行处理
try {
//console.log(data.length);
dataBuffer.fill(data, bufferWritePos, bufferWritePos + data.length);
bufferWritePos += data.length;
dataSplite(data);
}
catch (e){
console.log(e.message);
}
});
function dataSplite(data){
/*
* 首先开辟一个buffer 大小为所有数据帧长的最大值
* 将数据放入buffer中。
* 根据首2个字节确定 decoderType
* 通过decoderType 确定数据帧长 (如果是定长数据帧可直接确定,如果是变长帧则需要通过第3、4两个字节确定实际帧长)
* 1.定长帧处理方式:
* 判断当前数据长度,
* 如果 = 期望帧长 则直接处理
* 如果 < 期望帧长 则填入buffer等待后续数据
* 如果 > 期望帧长 则截取出期望帧长的数据,然后将剩余数据填入buffer等待后续数据
* 2.变长帧处理方式:
* 暂不需要
*/
var total = bufferWritePos;
var bufferReadPos = 0;
while(bufferReadPos < total){
var infoType = 2;//data.readUInt16LE(0);
var iskSize = getISKSize(infoType);
var isVarLenght = (iskSize == -1) ? true : false;
if(isVarLenght){
//如果是变长isk 则进行一下处理
//TODO:暂不考虑
}else{
//
}
/*
* 如果 iskSize 等于 0 则表示 infoType 为非法
* 应丢弃缓冲区中的所有数据
*/
if(iskSize == 0){
bufferWritePos = 0;
return;
}
if(bufferReadPos + iskSize <= total){
//分割出一个完整的isk数据,进行后续处理
var iskData = new Buffer(iskSize);
dataBuffer.copy(iskData, 0, bufferReadPos, bufferReadPos + iskSize);
dataProcess(iskData, decoderList[infoType]);
//读指针偏移
bufferReadPos += iskSize;
if(bufferReadPos == total){
bufferWritePos = 0;
}
}else{
/*
* 目前的缓冲区中的数据无法组成一个完整的isk消息
* 将当前缓冲区中的数据全部移动到缓冲区的前端,以等待后续数据
*/
bufferWritePos = total - bufferReadPos;
if(bufferReadPos > 0) {
dataBuffer.copy(dataBuffer, 0, bufferReadPos, total);
}
break;
}
}
}