Вот исходный код сокета сервера:
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'
}
Как это можно предотвратить и изящно закрыть клиентский сокет, когда удаленный хост преждевременно завершил соединение?