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);
});
});
謝謝!那我應該丟棄收到的數據嗎? – liuyanghejerry 2013-02-20 04:45:30
@liuyanghejerry完全取決於你在做什麼。 – EJP 2013-02-20 07:43:34
Err ...太糟糕了...... – liuyanghejerry 2013-02-20 09:55:15