当前位置:首页 > JavaScript

js 实现ping

2026-02-01 23:25:42JavaScript

在JavaScript中实现类似网络ping的功能可以通过多种方式实现,但由于浏览器安全限制,无法直接使用ICMP协议(传统ping的底层协议)。以下是几种替代方案:

使用XMLHttpRequest或Fetch API测量延迟

通过发送HTTP请求到目标服务器并计算响应时间,模拟ping的效果:

js 实现ping

function httpPing(url, callback) {
  const start = performance.now();
  fetch(url, { method: 'HEAD', mode: 'no-cors' })
    .then(() => {
      const latency = performance.now() - start;
      callback(null, latency);
    })
    .catch(err => callback(err));
}

// 使用示例
httpPing('https://example.com', (err, latency) => {
  if (err) console.error('Ping failed:', err);
  else console.log(`Latency: ${latency.toFixed(2)}ms`);
});

使用WebSocket测量连接时间

对于支持WebSocket的服务,可以测量初始连接时间:

js 实现ping

function wsPing(url, callback) {
  const start = performance.now();
  const ws = new WebSocket(url);

  ws.onopen = () => {
    const latency = performance.now() - start;
    ws.close();
    callback(null, latency);
  };

  ws.onerror = (err) => callback(err);
}

// 使用示例
wsPing('wss://echo.websocket.org', (err, latency) => {
  if (err) console.error('WS Ping failed:', err);
  else console.log(`WS Latency: ${latency.toFixed(2)}ms`);
});

使用Image对象测量加载时间

通过图片加载时间检测网络状况:

function imgPing(url, callback) {
  const img = new Image();
  const start = performance.now();

  img.onload = img.onerror = () => {
    const latency = performance.now() - start;
    callback(null, latency);
  };

  img.src = url + '?t=' + Date.now(); // 避免缓存
}

// 使用示例
imgPing('https://example.com/favicon.ico', (err, latency) => {
  if (err) console.error('Image Ping failed:', err);
  else console.log(`Image Latency: ${latency.toFixed(2)}ms`);
});

注意事项

  • 所有方法都受同源策略限制,跨域请求需要服务器配置CORS
  • 测量结果包含HTTP协议开销,非纯网络层延迟
  • 频繁请求可能触发服务器速率限制
  • 对于Node.js环境,可以使用net模块或第三方包如net-ping实现更底层的ping功能

Node.js实现(需管理员权限)

在Node.js中可以使用原始套接字实现ICMP ping:

const { exec } = require('child_process');

function systemPing(host, callback) {
  exec(`ping -c 1 ${host}`, (error, stdout) => {
    if (error) return callback(error);
    const match = stdout.match(/time=(\d+\.?\d*) ms/);
    callback(null, match ? parseFloat(match[1]) : null);
  });
}

// 使用示例
systemPing('example.com', (err, latency) => {
  if (err) console.error('Ping failed:', err);
  else console.log(`ICMP Latency: ${latency}ms`);
});

标签: jsping
分享给朋友:

相关文章

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…