2017-07-23 77 views
0

比方說,我有一個主機名和端口列表,並不是所有的都與HTTP相關。檢查幾種不同的TCP/IP服務的可用性?

var config = { 
    "checks": [ 
    { 
     "name": "NPM", 
     "hostname": "npmjs.com", 
     "port": 80 
    }, 
    { 
     "name": "AWS", 
     "hostname": "aws.amazon.com", 
     "port": 443 
    }, 
    { 
     "name": "RabbitMQ", 
     "hostname": "merry-butterfly.rmq.cloudamqp.com", 
     "port": 5671 
    } 
    ] 
} 

測試每種服務都可以達到的有效方法是什麼?我的第一個想法是用典型的類似Telnet的方式,我這樣做:

var telnet = require('telnet-client') 

config.checks.forEach(function(check) { 
    var connection = new telnet() 

    var params = { 
    host: check.hostname, 
    port: check.port, 
    negotiationMandatory: false 
    } 

    connection.on('connect', function() { 
    connection.send('GET /', { 
     ors: '\r\n', 
     waitfor: '\n' 
    }, function(err, data) { 
     console.log(err, data); 
     connection.end() 
    }) 
    }) 

    connection.connect(params) 
    results.push(result); 
}); 

上面似乎工作,但實際上,我不知道什麼樣的數據發送給每一個人服務,以獲得回一個響應那麼就表明該服務是「可達」,我並不需要與服務進行認證或做任何操作,只是檢查,它可以達到。此外,它拋出一個異常,如果DNS是可達:

Error: getaddrinfo ENOTFOUND merry-butterfly.rmq.cloudamqp.com/api merry-butterfly.rmq.cloudamqp.com/api:443 

什麼是適當的方式來處理這些錯誤,並在每一個「檢查」的列表中的條目的異步測試?

+0

如果你只是想看看如果你能得到一個連接,那麼你可以使用這種類型的代碼:如何檢查服務器和端口在現有的NodeJS?](https://stackoverflow.com/questions/29069111/how-can-check-if-server-and-port-is-available-in-nodejs/29069322#29069322)。 – jfriend00

+0

此外,有些相關:[端口掃描在節點如果端口範圍太寬不起作用](https://stackoverflow.com/questions/36814081/portscan-in-node-doesnt-work-if-port-range-是太寬/ 36814411#36814411),因爲這測試了很多不同的端口的可用性,並可能適應在同一端口上使用不同的主機。 – jfriend00

+0

除非您爲每個服務所需的確切數據類型編碼,否則無法將任何數據發送到您連接的服務器。例如,如果它是一個http服務,那麼您需要將適當的http請求格式化爲要發送的數據。如果是其他協議,則必須發送適合該協議的數據。但是,您不需要向它發送任何數據就可以看到它至少對傳入連接做出響應。這隻需要建立一個TCP連接並看到連接成功並且準備好發送數據。 – jfriend00

回答

0

平主機。

https://www.npmjs.com/package/ping

例如:

var ping = require('ping'); 

var hosts = ['192.168.1.1', 'google.com', 'yahoo.com']; 
hosts.forEach(function(host){ 
    ping.sys.probe(host, function(isAlive){ 
     var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead'; 
     console.log(msg); 
    }); 
}); 
+0

這將如何與非HTTP協議一起工作? –

+0

@JPSilvashy只要遠程服務器回答ping,它就可以用於任何協議。如果不回答坪,它需要一個定製的解決方案(如果好心回答的東西),否則將不可能在所有如果遠程服務器使用某種加密和唯一的反應,一些關鍵你不」沒有。 – sidewinder

+0

這告訴你只有當主機正在回答ping(這是它自己的服務器進程)。它不會告訴你主機是否在特定的端口上進行應答,以尋找特定的服務。有些服務明確地不在主機上啓用ping響應,當然可以有支持ping響應的主機,但您尋找的實際服務器進程已關閉,無法響應或甚至沒有響應。所以,如果答案是肯定的,那麼你只知道該主機在線。如果它沒有回答,你就不知道這意味着什麼。 – jfriend00