首页新闻找找看学习计划

socket设置setNoDelay为true不起作用,怎么回事?

0
悬赏园豆:5 [已解决问题] 解决于 2016-03-30 11:36

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事件么?还是有什么其他的算法?求解释

草谷子的主页 草谷子 | 初学一级 | 园豆:177
提问于:2016-03-25 17:45
< >
分享
最佳答案
0

虽然没玩过nodejs的socket,不过看上去这里是server端缓存了的结果.虽然你是直接发了,不过发的速度很快,所以在server发出data事件前缓冲区就收到了下一组数据

收获园豆:5
wengys | 菜鸟二级 |园豆:207 | 2016-03-25 18:26

用tcpdump抓包工具监控了一下发现,client.setNoDelay(true);貌似只是禁用了Nagle算法,并不能确保每一次write都能立即发送出去。

我想应用层上的打包、解包数据和网络层的发送、接收数据应该是并行工作的,nodejs只是在特定的时候向其发出相应的信号而已。

草谷子 | 园豆:177 (初学一级) | 2016-03-30 11:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册