2013-02-20 857 views
2

我有一个pub/sub模型,使用Node.js将数据从一个客户端传输到另一个客户端。此外,服务器还会记录收到的所有内容并发送给新客户端。如何处理Node.js中的'read ETIMEDOUT'?

然而,当传输损坏的一些数据,我得到了错误,如:

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); 
    }); 
}); 

回答

2

如果你得到一个EPIPE或者实际上写的时候有任何错误,同行已关闭或连接已断开。所以你必须在那个时候关闭连接。

如果你得到一个读取超时,推断是你设置了一个不现实的短暂超时或者对方未能及时发送:在第二种情况下,你应该再次假设连接已关闭,并关闭它。

+0

谢谢!那我应该丢弃收到的数据吗? – liuyanghejerry 2013-02-20 04:45:30

+0

@liuyanghejerry完全取决于你在做什么。 – EJP 2013-02-20 07:43:34

+0

Err ...太糟糕了...... – liuyanghejerry 2013-02-20 09:55:15