用nodejs写一个网页显示当前局域网的所有ip地址
时间: 2023-11-04 20:04:23 浏览: 248
可以使用 Node.js 的 `os` 和 `net` 模块来实现获取局域网中所有 IP 地址的功能。具体步骤如下:
1. 获取当前主机的 IP 地址,可以使用 `os` 模块中的 `networkInterfaces` 方法获取,然后筛选出 IPv4 类型的地址;
2. 遍历当前主机所在的子网中的所有 IP 地址,可以使用 `net` 模块中的 `createServer` 方法创建一个服务,监听指定的端口,然后遍历该端口所在的子网中的所有 IP 地址,如果能够连接到该端口,则说明该 IP 地址是可用的。
下面是代码实现:
```javascript
const os = require('os');
const net = require('net');
// 获取本机 IPv4 地址
function getLocalIP() {
const interfaces = os.networkInterfaces();
for (let key in interfaces) {
const iface = interfaces[key];
for (let i = 0; i < iface.length; i++) {
const { address, family, internal } = iface[i];
if (family === 'IPv4' && !internal) {
return address;
}
}
}
}
// 获取指定子网中所有 IP 地址
function getSubnetIPs(subnet) {
const ips = [];
const server = net.createServer();
server.on('listening', function() {
server.close();
const address = server.address();
const [, mask] = subnet.split('/');
const ipNumber = ipToNumber(address.address);
const maskNumber = 0xffffffff << (32 - mask);
for (let i = 1; i < maskNumber; i++) {
const ip = numberToIP(ipNumber | i);
ips.push(ip);
}
});
server.listen(0, subnet);
return new Promise(resolve => {
server.on('close', () => {
resolve(ips);
});
});
}
// IP 地址转数字
function ipToNumber(ip) {
return ip.split('.').reduce((result, item) => {
return (result << 8) + parseInt(item);
}, 0);
}
// 数字转 IP 地址
function numberToIP(number) {
return [
(number >> 24) & 0xff,
(number >> 16) & 0xff,
(number >> 8) & 0xff,
number & 0xff,
].join('.');
}
// 获取本机 IP 地址和子网中所有 IP 地址
async function getAllIPs() {
const localIP = getLocalIP();
const subnet = localIP.replace(/\.\d+$/, '.0/24');
const ips = await getSubnetIPs(subnet);
ips.unshift(localIP);
return ips;
}
// 启动一个 HTTP 服务,显示所有 IP 地址
const http = require('http');
http.createServer(function(req, res) {
if (req.url === '/') {
getAllIPs().then(ips => {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<html><body>');
res.write('<h1>Local IPs</h1>');
res.write('<ul>');
ips.forEach(ip => {
res.write(`<li>${ip}</li>`);
});
res.write('</ul>');
res.write('</body></html>');
res.end();
});
} else {
res.writeHead(404);
res.end();
}
}).listen(8080, function() {
console.log('Server is running at http://localhost:8080');
});
```
运行该脚本后,访问 http://localhost:8080 即可显示当前局域网的所有 IP 地址。
阅读全文