当前位置:首页 > 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实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

uniapp 网络封装

uniapp 网络封装

uniapp 网络请求封装方法 uniapp 提供了 uni.request 方法进行网络请求,但直接使用可能导致代码重复和维护困难。封装网络请求可以提高代码复用性和可维护性。 基础封装示例 创建一…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…