node.js - Node.js 中如何处理 'read ETIMEDOUT'?

标签 node.js networking proxy real-time publish-subscribe

我有一个使用 Node.js 的发布/订阅模型将数据从一个客户端传输到另一个客户端。此外,服务器还记录收到的所有内容并将其发送给新客户端。

但是,某些数据在传输时损坏,并且出现如下错误:

Error with socket!
{ [Error: write EPIPE] code: 'EPIPE', errno: 'EPIPE', syscall: 'write' }
Error with socket!
{ [Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }

我不知道如何正确处理这些错误。看起来客户端已关闭。

由于服务器只是像服务器一样的代理,它并不真正知道数据意味着什么。我不知道如何在遇到这些错误之前验证每个数据包。

这是我的代码:

// server is an object inheriting from net.Server
server.on('listening', function() {
    var port = server.address().port;
}).on('connection', function(cli) {
    cli.socketBuf = new Buffers();
    cli.commandStarted = false;
    cli.dataSize = 0;
    cli.setKeepAlive(true, 10*1000);
    cli.setNoDelay(true);
    cli.on('connect', function() {
        server.clients.push(cli);
    }).on('close', function() {
        var index = server.clients.indexOf(cli);
        server.clients.splice(index, 1);
    }).on('data', function (buf) {
        server.emit('data', cli, buf);
        if(op.autoBroadcast) {
            _.each(server.clients, function(c) {
                if(c != cli) c.write(buf);
            });
        }
    }).on('error', function(err) {
        console.log('Error with socket!');
        console.log(err);
    });
}).on('error', function(err) {
    console.log('Error with server!');
    console.log(err);
});

// ...

// room.dataSocket is an instance of server beyond
room.dataSocket.on('data', function(cli, d) {
    // bf is a buffered file
    bf.append(d);
    room.dataFileSize += d.length;
    
}).on('connection', function(con){
    bf.readAll(function(da) {
        con.write(da);
    });
});

最佳答案

如果您在写入时收到 EPIPE 或确实出现任何错误,则表明对等点已关闭或连接已断开。因此您必须在此时关闭连接。

如果出现读取超时,则推断要么您设置了不切实际的短超时,要么对等方未能及时交付:在第二种情况下,您应该再次假设连接已关闭,并将其关闭。

关于node.js - Node.js 中如何处理 'read ETIMEDOUT'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14972106/

相关文章:

http - HTTP 中介的请求处理模型

node.js - WebSocket 协议(protocol)激活前的 4 或 5 个轮询请求

windows - Windows Azure 虚拟机上的网络适配器被禁用(如何重新激活)

c# - 使用 DefaultWebProxy 获取 IE 的默认代理

java - 我需要为我的应用程序创建一个新网络

r - shapefile到R中的神经网络

.net - 通过特定代理从 VB.net Ping 服务器

node.js - EACCES:权限被拒绝,打开 '/usr/local/lib/node_modules/npm/bin/npm-cli.js'

javascript - 在具有通过 gulp-submodule 注入(inject)的依赖项的模块上运行 gulp 任务,该模块又通过 gulp-submodule 拥有自己的依赖项,失败

c++ - C++ 外部的垃圾收集