nodejs 中的net模块 数据接收事件相关问题

kq9yhe63 2015-08-27 04:23:46

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 connected
20647
20647
20647
20647
20647
18980
1667
20647
20647
20647
20647

客户端发送的是 数据块长度 = 20647字节的等长数据
为什么接收到的数据长度会出现问题?
求高手解答
...全文
466 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TDArray 2016-12-19
  • 打赏
  • 举报
回复
引用 6 楼 zyl_lyr1019 的回复:
我不太理解,你把这个搞的这么复杂干嘛? 你在end事件里面,接收数据不就可以了吗?
client.on('end', function(data){
            //会话终止
console,log(data.length);
        });
你试过这样写吗?
大神我问一下,我用的网络调试助手发送二进制数据(主要是服务器端是c++写的),然后用客户端接收,用楼主的方法也是出现了两段数据,用end没反应,应该怎么弄呢?
张运领 2015-09-04
  • 打赏
  • 举报
回复
我不太理解,你把这个搞的这么复杂干嘛? 你在end事件里面,接收数据不就可以了吗?
client.on('end', function(data){
            //会话终止
console,log(data.length);
        });
你试过这样写吗?
wjyczhd 2015-09-02
  • 打赏
  • 举报
回复
自己顶一下自己顶一下
kq9yhe63 2015-09-02
  • 打赏
  • 举报
回复

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;
        }
    }
}
kq9yhe63 2015-08-28
  • 打赏
  • 举报
回复
自己顶一下 ,难道没有人遇到过么?
张运领 2015-08-28
  • 打赏
  • 举报
回复
在nodejs接收数据时,会一段一段的接收,或者是说,每次接收数据时,生成一段固定缓存的内存空间。 而这个空间是可以被重复利用的,比如:我现在创建了一段空间,可以支持的数据长度为100字节, 首次接收的字节数,会是50字节,那么这个空间,还剩下50字节,如果下次过来的数据,小于50字节,就会再使用这个空间,继续保存数据,而如果大于50字节,原来创建的空间,保存不下,就会把这50字节先保存,然后再新创建一个100字节的,再去保存剩下的数据,(应该是为了能更充分的利用内存吧) 当然:这个我说的是属于比较简单的情况,实质上好像比这个复杂的,不过基本是这个理论的吧。 所以,才会有监听end事件的情况,因为数据量不管大小,都可能会被截断的。 所以,你可以看到,你那两个有问题的数据,相加是属于正确的 或者,你再end的回调中,再测试,应该就是没有问题的。

87,955

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧