只要远程主机关闭套接字连接,Node.js应用就会崩溃
这里是服务器套接字的源代码:
const server = net.createServer(client => {
// 'connection' listener.
let processing = false;
client.setTimeout(config.socket.timeout);
client.on('data', data => {
const batches = data.toString().split(',');
if (!processing && batches && batches.length) {
processing = true;
processBatch(batches, error => {
const status = error ? 'ERR' : 'SUCC';
logger.verbose('... Ended with status : ' + status);
client.write(status, () => client.end());
});
}
});
client.on('timeout', () => {
logger.warn('Client socket did time out');
client.end();
});
//client.on('end', () => {});
});
server.on('error', error => {
logger.info('Socket error');
logger.error('Error: ', error);
});
server.listen(config.socket.port, () => {
console.log('*** Socket listening on port', config.socket.port);
});
客户端将进行连接,发送其数据,然后远程关闭连接,这将触发服务器错误处理程序,并记录以下消息:
Error: This socket has been ended by the other party
at Socket.writeAfterFIN [as write] (net.js:441:14)
at file:///home/thermo/bwkl/src/service.js:191:20
at file:///home/thermo/bwkl/src/service.js:123:13 {
code: 'EPIPE'
}
如何防止这种情况,并在远程主机过早终止连接时正常关闭客户端套接字?
回答如下:server
错误处理程序未捕获到连接错误,因为client
发出了错误事件。
只要远程主机关闭套接字连接,Node.js应用就会崩溃
这里是服务器套接字的源代码:
const server = net.createServer(client => {
// 'connection' listener.
let processing = false;
client.setTimeout(config.socket.timeout);
client.on('data', data => {
const batches = data.toString().split(',');
if (!processing && batches && batches.length) {
processing = true;
processBatch(batches, error => {
const status = error ? 'ERR' : 'SUCC';
logger.verbose('... Ended with status : ' + status);
client.write(status, () => client.end());
});
}
});
client.on('timeout', () => {
logger.warn('Client socket did time out');
client.end();
});
//client.on('end', () => {});
});
server.on('error', error => {
logger.info('Socket error');
logger.error('Error: ', error);
});
server.listen(config.socket.port, () => {
console.log('*** Socket listening on port', config.socket.port);
});
客户端将进行连接,发送其数据,然后远程关闭连接,这将触发服务器错误处理程序,并记录以下消息:
Error: This socket has been ended by the other party
at Socket.writeAfterFIN [as write] (net.js:441:14)
at file:///home/thermo/bwkl/src/service.js:191:20
at file:///home/thermo/bwkl/src/service.js:123:13 {
code: 'EPIPE'
}
如何防止这种情况,并在远程主机过早终止连接时正常关闭客户端套接字?
回答如下:server
错误处理程序未捕获到连接错误,因为client
发出了错误事件。