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

使用 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,客户端就打印一次,而不是全部接受完再触发函数打印。
而且为什么第一次就能成功打印出来...

阅读 3.2k
2 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题