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 )
});
其中message 和 userList是连续调用了socket.write, 如:
socket.write({ type: 'message', ... })
socket.write({ type: 'userList', ... })
怎么实现一个write,客户端就打印一次,而不是全部接受完再触发函数打印。
而且为什么第一次就能成功打印出来...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
流式处理时, 数据是连续的, 如需要逻辑分隔, 你可以自己在发送一段逻辑数据后,发送分隔符, 然后在客户端用分隔符再分段处理.
默认node.js的TCP协议是开启了nagle算法的,这个算法会暂缓小数据包的发送,自动拼接小数据包变成大数据包以节省开销。你现在的做法依赖于每
write
一次就发送一个数据包,并在对方触发一个data
事件这一假设,但这是无法保证的,有时候你的数据甚至会分几次传送到另一端。你必须要自己定义应用层数据包的格式,或者说包的结束标志,用一个结束标志来明确地将多段数据分开。例如,你可以使用你的数据中绝对不会出现的\n
作为结束标志,然后在处理data
事件时,每次都先缓存之前的数据,直到读取到\n
再截取相应的部分处理。