node的net模块,对于数据读写问题

发布于 2022-09-11 15:36:54 字数 952 浏览 27 评论 0

使用 node的net模块
传输的格式希望是json,但是net.write只支持buffer和字符串
于是我使用json.stringify格式化对象数据

在运行聊天室时候,第一个用户登录,打印都很正常,第二个用户登录就报错了,原因是监听的data方法,传回来的data是连续的

如图:简略的写法

server

var json = JSON.stringify
socket.write(json ('1'))
socket.write(json ('2'))
socket.write(json ('3'))

client

socket.on('data', function (data) {
    data = JSON.parse(data);
    console.log(data )
  });

clipboard.png

clipboard.png

其中message 和 userList是连续调用了socket.write, 如:

socket.write({ type: 'message', ... })
socket.write({ type: 'userList', ... })

怎么实现一个write,客户端就打印一次,而不是全部接受完再触发函数打印。
而且为什么第一次就能成功打印出来...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

回心转意 2022-09-18 15:36:54

流式处理时, 数据是连续的, 如需要逻辑分隔, 你可以自己在发送一段逻辑数据后,发送分隔符, 然后在客户端用分隔符再分段处理.

折戟 2022-09-18 15:36:54

默认node.js的TCP协议是开启了nagle算法的,这个算法会暂缓小数据包的发送,自动拼接小数据包变成大数据包以节省开销。你现在的做法依赖于每write一次就发送一个数据包,并在对方触发一个data事件这一假设,但这是无法保证的,有时候你的数据甚至会分几次传送到另一端。你必须要自己定义应用层数据包的格式,或者说包的结束标志,用一个结束标志来明确地将多段数据分开。例如,你可以使用你的数据中绝对不会出现的\n作为结束标志,然后在处理data事件时,每次都先缓存之前的数据,直到读取到\n再截取相应的部分处理。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文