节点网络套接字连接超时

时间:2015-03-30 21:37:51

标签: node.js sockets timeout

我注意到,我的节点服务器的net.createConnection()在某些情况下触发错误之前有一个很长的超时(似乎是端口的特殊问题......)

我尝试连接到某个域名:9000(按预期收听和连接) 和某些域名:1234(相同的域名,不同的端口,等待大约2分钟直到"连接ETIMEDOUT")

当我连接到不存在的域时,我立即收到错误,但如果我连接到可访问主机上的无法访问的端口,则不会收到错误。 我需要确定机器是否可以在< 1sec ..

中到达

我该如何处理?必须以某种方式在2分钟内注意到无法访问的端口? 至少某种超时只是在设定的时间之后将地址设置为无法访问?

由于

更新:当前连接代码:

this.openConnection = function() {
    try {
        console.log("[INFO] connecting to " + device.ip + ":" + device.port);
        device.clientSocket = new net.createConnection(this.port,this.ip)
            .on('connect', device.connected)
            .on('data', device.inputReceived)
            .on('error', function(err) {

                if (err.code == "ENOTFOUND") {
                    console.log("[ERROR] No device found at this address!");
                    device.clientSocket.destroy();
                    return;
                }

                if (err.code == "ECONNREFUSED") {
                    console.log("[ERROR] Connection refused! Please check the IP.");
                    device.clientSocket.destroy();
                    return;
                }


                console.log("[CONNECTION] Unexpected error! " + err.message + "     RESTARTING SERVER");


                process.exit(1);

            })
            .on('disconnect', function() {
                console.log("[CONNECTION] disconnected!");
            });
    } catch(err) {
        console.log("[CONNECTION] connection failed! " + err);
    }
};

1 个答案:

答案 0 :(得分:8)

当你连接时,你可以为你想要的任何超时设置你自己的计时器,如果在计时器触发时连接没有成功,那么它就没有你想要的那么快。

这可以封装在单个函数中,只需一个回调或返回一个promise。


根据您的代码,这里有一个添加超时的镜头(未经测试的代码):

this.openConnection = function(timeout) {
    var timer;
    timeout = timeout || 2000;
    try {
        console.log("[INFO] connecting to " + device.ip + ":" + device.port);
        device.clientSocket = new net.createConnection(this.port,this.ip)
            .on('connect', function() {
                clearTimeout(timer);
                device.connected();
            })
            .on('data', function() {
                clearTimeout(timer);
                device.inputReceived();
            })
            .on('error', function(err) {
                clearTimeout(timer);
                if (err.code == "ENOTFOUND") {
                    console.log("[ERROR] No device found at this address!");
                    device.clientSocket.destroy();
                    return;
                }

                if (err.code == "ECONNREFUSED") {
                    console.log("[ERROR] Connection refused! Please check the IP.");
                    device.clientSocket.destroy();
                    return;
                }


                console.log("[CONNECTION] Unexpected error! " + err.message + "     RESTARTING SERVER");


                process.exit(1);

            })
            .on('disconnect', function() {
                console.log("[CONNECTION] disconnected!");
            });
        timer = setTimeout(function() {
            console.log("[ERROR] Attempt at connection exceeded timeout value");
            device.clientSocket.end();
        }, timeout);
    } catch(err) {
        console.log("[CONNECTION] connection failed! " + err);
    }
};