js 实现 ping
使用 WebSocket 实现 Ping
在浏览器环境中,可以通过 WebSocket 发送消息并测量往返时间(RTT)来模拟 ping 功能。以下是一个示例代码:
function pingWebSocket(url) {
const startTime = Date.now();
const ws = new WebSocket(url);
ws.onopen = () => {
ws.send('ping');
console.log('WebSocket connection established');
};
ws.onmessage = () => {
const rtt = Date.now() - startTime;
console.log(`Ping time: ${rtt}ms`);
ws.close();
};
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
}
使用 Fetch API 实现 Ping
通过 Fetch API 测量 HTTP 请求的响应时间:
async function pingFetch(url) {
const startTime = Date.now();
try {
const response = await fetch(url, { method: 'HEAD' });
const rtt = Date.now() - startTime;
console.log(`Ping time: ${rtt}ms`);
return rtt;
} catch (error) {
console.error('Ping failed:', error);
return null;
}
}
使用 XMLHttpRequest 实现 Ping
传统 XMLHttpRequest 也可以用于测量请求时间:
function pingXHR(url) {
const startTime = Date.now();
const xhr = new XMLHttpRequest();
xhr.open('HEAD', url);
xhr.onload = () => {
const rtt = Date.now() - startTime;
console.log(`Ping time: ${rtt}ms`);
};
xhr.onerror = () => {
console.error('Ping failed');
};
xhr.send();
}
使用 Performance API 获取更精确时间
Performance API 可以提供更高精度的时间测量:
async function pingWithPerformance(url) {
const start = performance.now();
try {
await fetch(url, { method: 'HEAD' });
const duration = performance.now() - start;
console.log(`Ping time: ${duration.toFixed(2)}ms`);
return duration;
} catch (error) {
console.error('Ping failed:', error);
return null;
}
}
注意事项
这些方法都会受到浏览器同源策略的限制。对于跨域请求,服务器需要设置适当的 CORS 头。
WebSocket 方法需要服务器支持 WebSocket 协议,其他 HTTP 方法需要服务器响应 HEAD 或 GET 请求。
这些实现测量的是应用层协议的响应时间,不是真正的 ICMP ping,但可以满足大多数 Web 应用的类似需求。







