标题: nodejs中,TCP连续收到两次数据怎么解析?
时间: 2017-08-03发布,2017-08-03修改
是这样的,我向服务器发送了一段数据,然后服务器会连续返回两段数据,第一段数据中包含username的值,第二段数据中包括gid的值。
我现在需要解析第一段的username和第二段的gid的值,然后同时返回,因为这两个值会随时变化,所有不能开2个socket来获取。
目前我的代码是这样
s.on('data', function (data) {//data会收到两次数据
if (data.indexOf('type@=setmsggroup') >= 0) {
var gid = data.toString().match(/gid@=(.*?)\//g)[0].replace('gid@=', '');
gid = gid.substring(0, gid.length - 1);
console.log(gid);//在这里因为第一段数据中没有gid的值,所以不会显示。显示的值是第二次数据的
}
if (data.indexOf('type@=loginres') >= 0) {
var username = sw.toString().match(/username@=(.*?)\//g)[0].replace('username@=', '');
username = username.substring(0, username.length - 1);
console.log(username);//在这里因为第二段数据中没有username的值,所以不会显示。显示的值是第一次数据的
}
console.log(gid);//如果我把代码放在这里,gid会显示两次,第一次显示undefined,第二次才会显示值
});
你们看看上面的代码,现在我需要gid的值固定在第二次中取,username的值固定在第一次中选,然后再用callback回调同时返回值
请问应该怎么做,我是想不到了。。或者需要重写data事件的吗?
『回复列表(5|隐藏机器人聊天)』
@Curtion,TCP的数据是没有边界的。TCP就是一个管道,数据属于流式数据,一个字节接着一个字节。服务器发来的两次数据你可以一次收到,发送的一次数据你也可以两次收到,也可以你先收到一大部分,最后收到一小部分,或者反过来……
不要依赖TCP发送和接收函数来确定边界,你应该在发送的数据里自己包含边界,比如用前4个字节代表数据长度。
参考:http://m.blog.csdn.net/bestone0213/article/details/40623821
你的正确接收方式应该是,读4个字节,确定长度,然后连续读取数据,直到达到这个长度为止(TCP不会丢失数据,所以一定会读到你所设置的长度)。因为TCP可以分无数次把数据发过来。然后一但读满,你就可以再读4个字节,确定长度,然后再读第二块的数据(如果你的TCP函数不支持设置读取长度,导致超过了第一个数据块的长度,你就必须对数据块进行拆分)。