比方說,我有一個主機名和端口列表,並不是所有的都與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
什麼是適當的方式來處理這些錯誤,並在每一個「檢查」的列表中的條目的異步測試?
如果你只是想看看如果你能得到一個連接,那麼你可以使用這種類型的代碼:如何檢查服務器和端口在現有的NodeJS?](https://stackoverflow.com/questions/29069111/how-can-check-if-server-and-port-is-available-in-nodejs/29069322#29069322)。 – jfriend00
此外,有些相關:[端口掃描在節點如果端口範圍太寬不起作用](https://stackoverflow.com/questions/36814081/portscan-in-node-doesnt-work-if-port-range-是太寬/ 36814411#36814411),因爲這測試了很多不同的端口的可用性,並可能適應在同一端口上使用不同的主機。 – jfriend00
除非您爲每個服務所需的確切數據類型編碼,否則無法將任何數據發送到您連接的服務器。例如,如果它是一個http服務,那麼您需要將適當的http請求格式化爲要發送的數據。如果是其他協議,則必須發送適合該協議的數據。但是,您不需要向它發送任何數據就可以看到它至少對傳入連接做出響應。這隻需要建立一個TCP連接並看到連接成功並且準備好發送數據。 – jfriend00