js实现ping网络
使用纯JavaScript实现Ping功能
由于浏览器端的JavaScript受安全限制无法直接发送ICMP请求(传统Ping协议),但可以通过以下替代方案实现类似功能:
通过Image对象检测网络连通性
利用Image对象的onload/onerror事件检测目标地址是否可访问:

function pingViaImage(url, timeout = 3000) {
return new Promise((resolve) => {
const img = new Image();
img.onload = () => resolve(true);
img.onerror = () => resolve(false);
img.src = `${url}?t=${Date.now()}`;
setTimeout(() => resolve(false), timeout);
});
}
// 使用示例
pingViaImage('https://www.example.com/favicon.ico')
.then(online => console.log(online ? '在线' : '离线'));
通过Fetch API测量延迟
使用fetch请求测量网络往返时间:
async function pingViaFetch(url, timeout = 5000) {
const start = performance.now();
try {
const response = await fetch(url, {
method: 'HEAD',
mode: 'no-cors',
cache: 'no-store'
});
const end = performance.now();
return end - start; // 返回毫秒级延迟
} catch {
return null; // 请求失败
}
}
// 使用示例
pingViaFetch('https://api.example.com/health')
.then(latency => console.log(latency ? `延迟: ${latency}ms` : '请求失败'));
WebSocket连接测试
适用于需要测试实时服务的情况:

function pingViaWebSocket(url, timeout = 3000) {
return new Promise((resolve) => {
const ws = new WebSocket(url);
const timer = setTimeout(() => {
ws.close();
resolve(false);
}, timeout);
ws.onopen = () => {
clearTimeout(timer);
ws.close();
resolve(true);
};
ws.onerror = () => resolve(false);
});
}
注意事项
- 跨域限制:所有方法都受同源策略限制,测试第三方域名需对方服务器配置CORS
- 准确性:这些方法测量的是HTTP层响应,非传统ICMP Ping
- 服务端要求:目标地址需要有对应的响应端点(如HTTP服务、WebSocket服务)
Node.js环境实现
在Node.js中可通过net模块或第三方包实现真实Ping:
const net = require('net');
const dns = require('dns');
async function systemPing(host, port = 80, timeout = 3000) {
return new Promise((resolve) => {
const socket = new net.Socket();
socket.setTimeout(timeout);
socket.on('connect', () => {
socket.destroy();
resolve(true);
});
socket.on('timeout', () => {
socket.destroy();
resolve(false);
});
socket.on('error', () => resolve(false));
dns.lookup(host, (err, address) => {
if (err) return resolve(false);
socket.connect(port, address);
});
});
}
对于需要完整ICMP支持的情况,建议使用ping等npm包:
npm install ping






