2013-02-20 865 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