当前位置:首页 > JavaScript

js实现ping网络

2026-03-15 15:43:45JavaScript

使用纯JavaScript实现Ping功能

由于浏览器端的JavaScript受安全限制无法直接发送ICMP请求(传统Ping协议),但可以通过以下替代方案实现类似功能:

通过Image对象检测网络连通性

利用Image对象的onload/onerror事件检测目标地址是否可访问:

js实现ping网络

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连接测试

适用于需要测试实时服务的情况:

js实现ping网络

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

标签: 网络js
分享给朋友:

相关文章

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…