【问题标题】:NodeJS net package error when client writing to server客户端写入服务器时NodeJS网络包错误
【发布时间】:2017-12-21 09:05:00
【问题描述】:

所以我采用了以下代码https://gist.github.com/tedmiston/5935757 示例并对其稍作修改,以便客户端将数据写入服务器。这应该是可行的,因为客户端套接字确实支持写入。在我的一个用例中,客户端将大量数据从客户端发送到服务器,在这种情况下我收到 ECONNRESET 错误。附上客户端和服务器sn-ps。我想知道是否有人看到了这一点,以及他们是否知道幕后发生了什么问题。

这是我的客户的副本:

var net = require('net');

var client = new net.Socket({writeable: true}); //writeable true does not appear to help 

client.on('close', function() {

    console.log('Connection closed');
});

client.on('error', function(err) {

    console.error('Connection error: ' + err);
    console.error(new Error().stack);
});

client.connect(5900, '127.0.0.1', function() {

    var count = 0;

    console.log('Connected');

    for(var i = 0; i < 100000; i++) {

        client.write('' + i + '');

        //bufferSize does not seem to be an issue
        //console.info(client.bufferSize);
    }
});

和我的服务器:

var net = require('net');

var count = 0;

var server = net.createServer(function(socket) {

    socket.pipe(socket);  //With this uncommented I get an ECONNRESET exception after 14299 writes with it commented it hangs after 41020 writes

    socket.on('data', function(data) {

        console.info(count++);  //This makes it occur sooner
        //count++;

        //maxConnections is not the issue
        //server.getConnections(function(err, count) {

            //console.info('count = ' + count);
        //});
    });

    socket.on('close', function() {

        console.info('Socket close');
    });

    socket.on('error', function(err) {

        console.error('Socket error: ' + err + ', count = ' + count);
        console.error(new Error().stack);
    });
});

server.listen(5900, '127.0.0.1');

【问题讨论】:

    标签: node.js sockets


    【解决方案1】:

    当客户端在其connect 事件处理程序内的for 循环中完成发送数据时,它没有任何事情要做,所以它退出。这会终止连接,服务器会收到一个ECONNRESET 来通知它连接已断开。

    如果您希望客户端在发送完成后继续闲逛,那么请给它一些存活的理由。在客户端套接字上注册data 事件处理程序是一种可能。

    【讨论】:

    • 我认为这不是问题所在。服务器只收到了大约 10,000 个,而不是客户端发送的 100,000 个。在我的示例中实现所有的侦听器:事件侦听器关闭、数据、排水、结束、查找、超时。我注意到客户端会定期接收数据事件以及排水事件。由于这些不存在,因此导致客户端错误。感谢您的关注和回复!
    • 允许 TCP 在一次读取中传递多个写入的内容,因此即使成功运行,您的服务器也不会看到 100,000 个data 事件。要跟踪服务器收到了多少,请将给定的data 参数的长度相加。它应该是 488890(在我上次测试中由 42188 个事件提供)。客户端获取数据是因为服务器正在回显它接收到的所有内容。如果客户端尚未注册处理程序或 pipe() 目标,则该数据将被丢弃,但这不会中断连接。
    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多