开发者工具箱-鸿蒙网络工具之端口扫描开发实践
2025-06-04 13:16:12
199次阅读
0个评论
鸿蒙网络工具之端口扫描开发实践
前言
最近在开发鸿蒙开发者工具箱时,需要实现一个端口扫描功能。这个功能可以帮助开发者快速检测目标主机的端口开放情况,对于网络调试和安全性测试非常有用。经过实践,我们使用HTTP协议实现了这个功能,虽然和传统的端口扫描工具有所不同,但基本能满足开发调试的需求。
一、功能概述
1.1 基本功能
- 支持IP地址和域名扫描
- 可自定义端口范围
- 实时显示扫描进度
- 支持批量端口扫描
- 美观的结果展示
1.2 界面功能
- 目标地址输入
- 端口范围设置
- 扫描进度显示
- 结果展示
- 收藏功能
二、技术实现
2.1 实现原理
端口扫描的实现原理相对简单:
- 通过HTTP请求尝试连接目标主机的指定端口
- 如果连接成功,说明端口开放
- 如果连接失败或超时,说明端口关闭
2.2 常用端口知识
在端口扫描时,了解一些常用端口的作用会很有帮助:
- 
  常见服务端口 - 80/443:HTTP/HTTPS服务
- 21:FTP服务
- 22:SSH服务
- 23:Telnet服务
- 25:SMTP邮件服务
- 53:DNS服务
- 3306:MySQL数据库
- 3389:远程桌面
 
- 
  端口分类 - 0-1023:系统端口,需要管理员权限
- 1024-49151:用户端口,普通应用使用
- 49152-65535:动态端口,临时使用
 
- 
  扫描建议 - 建议先扫描常用端口
- 避免扫描系统端口
- 注意扫描频率
- 遵守相关法规
 
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 遇到的问题
- 
  扫描效率 - 问题:扫描速度较慢
- 解决:设置合理的超时时间
 
- 
  输入验证 - 问题:无效的端口范围
- 解决:添加格式验证
 
- 
  进度显示 - 问题:进度更新不及时
- 解决:使用回调函数
 
- 
  资源管理 - 问题:内存占用
- 解决:及时释放资源
 
3.2 优化建议
- 
  输入验证 - 检查IP格式
- 验证端口范围
- 处理特殊字符
 
- 
  性能优化 - 控制扫描频率
- 优化UI渲染
- 及时释放资源
 
- 
  用户体验 - 显示扫描进度
- 支持取消操作
- 保存扫描历史
 
- 
  安全性 - 限制扫描范围
- 控制扫描频率
- 保护用户隐私
 
四、总结
端口扫描工具实现了基本的端口检测功能,虽然使用HTTP协议实现,但基本满足了开发调试需求。通过这个工具,可以:
- 检测端口开放情况
- 诊断网络问题
- 进行安全测试
- 优化网络配置
五、参考资源
欢迎体验
本文介绍的端口扫描工具已集成到鸿蒙开发者工具箱中,欢迎下载体验更多功能!
作者:在人间耕耘 邮箱:1743914721@qq.com 版权声明:本文为CSDN博主原创文章,转载请附上原文出处链接及本声明。
00
