开发者工具箱-鸿蒙网络工具之端口扫描开发实践

2025-06-04 13:16:12
147次阅读
0个评论

鸿蒙网络工具之端口扫描开发实践

前言

最近在开发鸿蒙开发者工具箱时,需要实现一个端口扫描功能。这个功能可以帮助开发者快速检测目标主机的端口开放情况,对于网络调试和安全性测试非常有用。经过实践,我们使用HTTP协议实现了这个功能,虽然和传统的端口扫描工具有所不同,但基本能满足开发调试的需求。

一、功能概述

1.1 基本功能

  • 支持IP地址和域名扫描
  • 可自定义端口范围
  • 实时显示扫描进度
  • 支持批量端口扫描
  • 美观的结果展示

1.2 界面功能

  • 目标地址输入
  • 端口范围设置
  • 扫描进度显示
  • 结果展示
  • 收藏功能

二、技术实现

2.1 实现原理

端口扫描的实现原理相对简单:

  1. 通过HTTP请求尝试连接目标主机的指定端口
  2. 如果连接成功,说明端口开放
  3. 如果连接失败或超时,说明端口关闭

2.2 常用端口知识

在端口扫描时,了解一些常用端口的作用会很有帮助:

  1. 常见服务端口

    • 80/443:HTTP/HTTPS服务
    • 21:FTP服务
    • 22:SSH服务
    • 23:Telnet服务
    • 25:SMTP邮件服务
    • 53:DNS服务
    • 3306:MySQL数据库
    • 3389:远程桌面
  2. 端口分类

    • 0-1023:系统端口,需要管理员权限
    • 1024-49151:用户端口,普通应用使用
    • 49152-65535:动态端口,临时使用
  3. 扫描建议

    • 建议先扫描常用端口
    • 避免扫描系统端口
    • 注意扫描频率
    • 遵守相关法规

2.3 核心代码实现

@Entry
@Component
struct PortScanner {
  @State host: string = '';              // 目标主机地址
  @State portRange: string = '';         // 端口范围
  @State result: string = '';            // 扫描结果
  @State isScanning: boolean = false;    // 扫描状态
  @State progress: number = 0;           // 扫描进度

  // 开始扫描
  private async startScan(): Promise<void> {
    try {
      this.isScanning = true;
      this.progress = 0;
      this.result = '正在扫描中...\n';

      // 解析端口范围
      const range = this.portRange.split('-');
      const startPort = parseInt(range[0]);
      const endPort = parseInt(range[1]);

      // 执行端口扫描
      const openPorts = await NetworkService.scanPorts(
        this.host.trim(),
        startPort,
        endPort,
        (current, total) => {
          this.progress = Math.floor((current / total) * 100);
        }
      );

      // 处理扫描结果
      if (openPorts.length > 0) {
        this.result = `扫描完成!\n\n发现 ${openPorts.length} 个开放端口:\n\n`;
        openPorts.forEach(port => {
          this.result += `📌 端口 ${port} 开放\n`;
        });
      } else {
        this.result = '扫描完成!未发现开放端口。';
      }
    } catch (error) {
      this.result = `扫描失败: ${error?.message || '未知错误'}`;
    } finally {
      this.isScanning = false;
      this.progress = 100;
    }
  }
}

// 网络服务
export class NetworkService {
  // 扫描端口
  static async scanPorts(
    host: string,
    startPort: number,
    endPort: number,
    progressCallback?: (current: number, total: number) => void
  ): Promise<number[]> {
    const openPorts: number[] = [];
    const total = endPort - startPort + 1;
    let current = 0;

    for (let port = startPort; port <= endPort; port++) {
      try {
        const httpRequest = http.createHttp();
        const response = await httpRequest.request(
          `http://${host}:${port}`,
          {
            method: http.RequestMethod.GET,
            connectTimeout: 1000,
            readTimeout: 1000
          }
        );
        
        if (response.responseCode >= 200 && response.responseCode < 400) {
          openPorts.push(port);
        }
      } catch (error) {
        // 连接失败,端口可能关闭
      } finally {
        current++;
        progressCallback?.(current, total);
      }
    }

    return openPorts;
  }
}

三、开发经验

3.1 遇到的问题

  1. 扫描效率

    • 问题:扫描速度较慢
    • 解决:设置合理的超时时间
  2. 输入验证

    • 问题:无效的端口范围
    • 解决:添加格式验证
  3. 进度显示

    • 问题:进度更新不及时
    • 解决:使用回调函数
  4. 资源管理

    • 问题:内存占用
    • 解决:及时释放资源

3.2 优化建议

  1. 输入验证

    • 检查IP格式
    • 验证端口范围
    • 处理特殊字符
  2. 性能优化

    • 控制扫描频率
    • 优化UI渲染
    • 及时释放资源
  3. 用户体验

    • 显示扫描进度
    • 支持取消操作
    • 保存扫描历史
  4. 安全性

    • 限制扫描范围
    • 控制扫描频率
    • 保护用户隐私

四、总结

端口扫描工具实现了基本的端口检测功能,虽然使用HTTP协议实现,但基本满足了开发调试需求。通过这个工具,可以:

  • 检测端口开放情况
  • 诊断网络问题
  • 进行安全测试
  • 优化网络配置

五、参考资源

欢迎体验

本文介绍的端口扫描工具已集成到鸿蒙开发者工具箱中,欢迎下载体验更多功能!

鸿蒙开发者工具箱


作者:在人间耕耘 邮箱:1743914721@qq.com 版权声明:本文为CSDN博主原创文章,转载请附上原文出处链接及本声明。

收藏00

登录 后评论。没有帐号? 注册 一个。