NodeJs的Socket设置setNoDelay为true后不起作用,好奇怪,谁能解释一下?
服务器端代码如下:
var net = require('net'); var count = 0; var server = net.createServer(function(c){ console.log('client connected: ' + c.remoteAddress); c.on('data', function(data){ count ++; console.log(count + ': ' + data.toString()); }); c.on('end', function(){ console.log('disconnected from client'); }); }); server.listen(6200, function(){ console.log('server bound'); });
客户端代码如下:
const net = require('net'); const client = net.connect({port: 6200}, function(){ //'connect' listener console.log('connected to server!'); client.setNoDelay(true); client.write('hello'); client.write('world'); client.write('hello world!'); client.write('how do you do?'); }); client.on('data', (data)=>{ console.log(data.toString()); }); client.on('end', ()=>{ console.log('disconnected from server'); });
先后运行服务器和客户端后,服务器端输出如下:
server bound client connected: ::ffff:127.0.0.1 1: hello 2: worldhello world!how do you do?
为什么不是下面这个样子?
server bound client connected: ::ffff:127.0.0.1 1: hello 2: world 3: hello world! 4: how do you do?
难道服务器在读取数据的时候不是收到客户端的一次发送就触发data事件么?还是有什么其他的算法?求解释
虽然没玩过nodejs的socket,不过看上去这里是server端缓存了的结果.虽然你是直接发了,不过发的速度很快,所以在server发出data事件前缓冲区就收到了下一组数据
用tcpdump抓包工具监控了一下发现,client.setNoDelay(true);貌似只是禁用了Nagle算法,并不能确保每一次write都能立即发送出去。
我想应用层上的打包、解包数据和网络层的发送、接收数据应该是并行工作的,nodejs只是在特定的时候向其发出相应的信号而已。