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

我试图连接到somedomain:9000(监听,连接和按预期工作)和somedomain:1234(相同的域,不同的端口,等待大约2分钟,直到“连接ETIMEDOUT”)

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

我该怎么处理? 必须以某种方式在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楼 票数: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);
    }
};

  ask by Paul Schneider translate from so

未解决问题?本站智能推荐:

2回复

长POST node.js上的套接字超时

使用node.js http.createServer来监听POST请求。 如果请求快速完成,一切正常。 如果请求完成时间> 5秒,则不会将响应返回给客户端。 在创建的套接字上添加了事件侦听器: 在请求中间获得这些消息(在启动后大约10秒后): 但是在客户端套接字
1回复

根据http请求设置基于套接字的超时

如果持续时间超过10秒,则下面的代码将中止请求。 是否可以使用http模块根据请求设置基于socket的超时? 另外,我应该使用套接字并请求超时吗?
1回复

为每个新的套接字node.js设置超时

当我依靠net module构建自己的http module ,我想为每个新套接字设置一个超时时间。 我建立以下内容: 因此,如果我服务器的用户设置了新的超时期限,它将使用它。 如果不是,则默认值为2分钟。 我的问题是我的服务器不服务第一个连接,仅服务第二个。 我的意思是,对
1回复

Node.js-Socket.IO 1.0-超时事件

我正在使用Socket.IO(最新版本1.1.0)与Android应用(客户端)交换消息。 我想设置一个超时时间(例如5秒)来检查我的客户端是否仍处于连接状态(我想处理Android应用崩溃时的情况)。 此外,当此超时发生时,我想生成一个事件。 我想做的事情看起来像这样: 1 /设置
1回复

如何在node.js http模块中超时时发送响应

在nodejs.org socket.setTimeout上 ,它说 触发空闲超时时,套接字将收到“超时”事件,但不会断开连接。 但是当我测试这样的代码时: 套接字在超时后立即关闭,并且没有数据被回复到浏览器。 这与文档有很大的不同。 这是一个错误还是在http模块
1回复

Node.js 设置 setKeepAlive 不会通过 setTimeout 停止超时

我试图弄清楚 Node.js 的网络类是如何处理超时和保活的。 我将它们设置在服务器端并观察设置这些变量有什么不同。 我注意到,如果我将 keepalive 设置为以下内容: 事实上,它绝对会发送我用 Wireshark 观察到的 keepalive 数据包。 但是,即使我订阅了套接字的超
2回复

套接字连接不会超时

我正在尝试设置客户端尝试连接到服务器时的超时,如果服务器关闭,则连接将等待10秒,然后抛出超时异常。 就我而言,下面的代码无需等待就抛出IOException,我真的不明白!
1回复

套接字连接超时

在下面的代码中。 如果timout值为0(newSocket(Address,7010,0);等待时间为“ Total Time in MilliSeconds = 1024”如果timout值为1(newSocket(Address,7010,1);等待时间为“ Total时间以毫秒为单