js 实现 ping
在 JavaScript 中实现类似网络 ping 的功能通常通过发送 HTTP 请求或使用 WebSocket 来检测网络延迟和连通性。以下是几种常见方法:

使用 fetch API 测量延迟
通过发送 HTTP 请求并计算响应时间模拟 ping:

async function ping(url) {
const start = performance.now();
try {
const response = await fetch(url, { method: 'HEAD', mode: 'no-cors' });
const end = performance.now();
return end - start; // 返回延迟时间(毫秒)
} catch (error) {
return -1; // 请求失败
}
}
// 使用示例
ping('https://example.com').then(delay => {
console.log(delay >= 0 ? `延迟: ${delay}ms` : '请求失败');
});
使用 Image 对象检测连通性
适用于简单连通性测试,但不返回具体延迟:
function pingViaImage(url) {
return new Promise(resolve => {
const img = new Image();
const start = Date.now();
img.onload = img.onerror = () => {
resolve(Date.now() - start);
};
img.src = `${url}?t=${Date.now()}`; // 避免缓存
});
}
使用 WebSocket 实现实时 ping
适用于需要持续监测的场景:
function websocketPing(url) {
const ws = new WebSocket(url);
const start = performance.now();
ws.onopen = () => {
const latency = performance.now() - start;
console.log(`WebSocket 延迟: ${latency}ms`);
ws.close();
};
ws.onerror = () => console.log('连接失败');
}
注意事项
- 跨域限制:普通 HTTP 请求受同源策略限制,可通过
mode: 'no-cors'发送简单请求,但无法读取响应内容。 - 准确性:网络波动可能导致单次测量不准确,建议多次测量取平均值。
- 服务端支持:部分服务器可能拒绝
HEAD请求,需根据实际目标调整方法。
以上方法可根据具体需求选择,HTTP 方案适合简单检测,WebSocket 适合需要双向通信的场景。






