Node.js Node net socket.end事件触发两次?

Node.js Node net socket.end事件触发两次?,node.js,sockets,Node.js,Sockets,他开了两枪。我在想原因 在一个客户上,我有: 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 =

他开了两枪。我在想原因

在一个客户上,我有:

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();
    }

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

文件说:

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

服务器没有发送两个“FIN”数据包,是吗?有什么方法可以验证吗?

我想这是因为在
结束时,我立即尝试重新连接,然后再次捕获相同的事件。这样做似乎有点奇怪,但将其推迟到下一个滴答声起作用:

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

“…此函数是异步的。当发出'connect'事件时,将建立套接字。如果连接有问题,将不会发出'connect'事件。,发出'error'事件时将出现异常。”


事实上,
connect
事件可能不会触发,只是让它看起来像是两次触发的
end
事件?就像@robertklep所说的,可能会扩展错误检查以获得更多的特定代码。

我猜这是由于重用
net.Socket()
实例造成的。除了
enoint
,客户端没有记录任何错误,但它可能正在生成另一个错误。@robertklep它正在重用同一个实例,但事件处理程序只绑定一次。我尝试在eNote旁边添加一个else抛出来捕获其他类型的错误——没有其他错误。
this._sock.on('end', () => {
    console.log(`${Chalk.yellow('Lost connection')} to ${Chalk.underline(path)}. Attempting to reconnect...`);
    process.nextTick(connect);
});