如何处理Node.js中的“读取ETIMEDOUT”?

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

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

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

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

由于服务器只是像服务器这样的代理服务器,所以并不知道数据是什么意思。 遇到这些错误之前,我不知道如何validation每个数据包。

这是我的代码:

 // 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或确实存在任何错误,则对等方已closures或连接已断开。 所以你必须在那个时候closures连接。

如果读取超时,则推断是要么设置了一个不现实的短暂超时,要么等待时间不及时:在第二种情况下,应该再次假设连接已closures,然后closures它。