已掉线,重新登录

首页 > 绿虎论坛 > 杂类 > 超级灌水 (发帖)

标题: nodejs中,TCP连续收到两次数据怎么解析?

作者: @Ta

时间: 2017-08-03发布,2017-08-03修改

点击: 1708

是这样的,我向服务器发送了一段数据,然后服务器会连续返回两段数据,第一段数据中包含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|隐藏机器人聊天)』

1.

@老虎会游泳 为什么我的代码高亮会行号对不齐。。。。
红米Note4高配版(银色)

(/@Ta/2017-08-03 20:33//)

2. @Curtion,代码没错就语言错了吧,我小白一个,最近玩node.js配置环境都费了好大功夫
(/@Ta/2017-08-03 21:06//)

3.

@已重置,我选的js,应该差不多吧。。你是linux吗? nodejs的win端不用配置的啊,有安装包
红米Note4高配版(银色)

(/@Ta/2017-08-03 21:14//)

4.

@Curtion,TCP的数据是没有边界的。TCP就是一个管道,数据属于流式数据,一个字节接着一个字节。服务器发来的两次数据你可以一次收到,发送的一次数据你也可以两次收到,也可以你先收到一大部分,最后收到一小部分,或者反过来……

不要依赖TCP发送和接收函数来确定边界,你应该在发送的数据里自己包含边界,比如用前4个字节代表数据长度。

参考:http://m.blog.csdn.net/bestone0213/article/details/40623821

你的正确接收方式应该是,读4个字节,确定长度,然后连续读取数据,直到达到这个长度为止(TCP不会丢失数据,所以一定会读到你所设置的长度)。因为TCP可以分无数次把数据发过来。然后一但读满,你就可以再读4个字节,确定长度,然后再读第二块的数据(如果你的TCP函数不支持设置读取长度,导致超过了第一个数据块的长度,你就必须对数据块进行拆分)。

(/@Ta/2017-08-03 21:42//)

5. @Curtion,win的一键包,然后又熟悉模板框架引擎Express Vue2 axios VueRouter等等
分类好多😭

PS:windows 上学习NodeJS就是各种坑啊~ _ ~ !
(/@Ta/2017-08-03 21:58//)

回复需要登录

9月11日 05:00 星期四

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1