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