节点networkingsocket.end事件触发两次?

这个事件发射两次。 我试图找出原因。

在一个客户端,我有:

import Net from 'net'; import Chalk from 'chalk'; const fallback = [2,5,10,25,50,100,250,500,1000,2000]; class LocalNetworkInterface { constructor({path}) { this._sock = new Net.Socket(); this._pending = {}; this._count = 0; this._retry = 0; const connect = () => { this._sock.connect({path}); }; this._sock.on('connect',() => { this._retry = 0; console.log(`Connected to ${Chalk.underline(path)}`); }); this._sock.on('data',buffer => { let data = JSON.parse(buffer); this._pending[data.queryId].resolve(data); delete this._pending[data.queryId]; }); this._sock.on('end', () => { console.log(`Lost connection to ${Chalk.underline(path)}. Attempting to reconnect...`); connect(); }); this._sock.on('error', err => { if(err.code === 'ENOENT') { let ms = fallback[this._retry]; if(this._retry < fallback.length - 1) ++this._retry; console.log(`Socket server unavailable. Trying again in ${ms}ms`); setTimeout(connect, ms); } }); connect(); } // ... } 

和服务器:

 const sockServer = Net.createServer(c => { c.on('data', buffer => { let data = JSON.parse(buffer); // log('Received',data); let ql = queryLogger(); runQuery(Object.assign({}, data, {schema})).then(result => { ql(`${Chalk.magenta('socket')} ${print(data.query).trim()}`); let response = Object.assign({}, result, {queryId: data.queryId}); c.write(JSON.stringify(response)); }); }) }); sockServer.on('error', serverError => { if(serverError.code === 'EADDRINUSE') { let clientSocket = new Net.Socket(); clientSocket.on('error', clientError => { if(clientError.code === 'ECONNREFUSED') { FileSystem.unlink(SOCK_FILE, unlinkErr => { if(unlinkErr) throw unlinkErr; sockServer.listen(SOCK_FILE, () => { log(`Sock server improperly shut down. Listening on '${sockServer.address()}'`) }); }); } }); clientSocket.connect({path: SOCK_FILE}, () => { throw new Error(`Server already running`); }); } }); ['SIGTERM','SIGINT'].forEach(signal => process.on(signal, () => { console.log(`\rReceived ${Chalk.yellow(signal)}, shutting down ${Chalk.red('❤')}`); sockServer.close(); process.exit(); })); sockServer.listen(SOCK_FILE, () => { log(`Listening on ${Chalk.underline(sockServer.address())}`) }); 

当我重新启动服务器时,我在客户端上看到两次“丢失连接”。 为什么?

该文件说:

当套接字的另一端发送FIN数据包时发出。

服务器是不是发送两个“FIN”数据包呢? 任何方式我可以validation?

在文档中看到这个connect

“…这个函数是asynchronous的,当发出'connect'事件时,套接字被build立, 如果连接有问题,'connect'事件将不会被发射 ,'error'事件将被抛出“。

事件connect事件可能根本不是简单地让你看起来喜欢end事件发射两次? 就像@robertklep说的,也许扩展错误检查超过特定的代码。

认为这是因为end我立即尝试重新连接,然后同样的事件再次被捕获。 似乎有点奇怪,它会这样做,但推迟到下一个滴答作品:

 this._sock.on('end', () => { console.log(`${Chalk.yellow('Lost connection')} to ${Chalk.underline(path)}. Attempting to reconnect...`); process.nextTick(connect); });