Flutter Ping 检查服务器通讯信号强度

Flutter Ping 检查服务器通讯信号强度

前言

对通讯敏感的程序中,我们除了检查当前网络通道外,还要检查与服务器实际的型号强度。

一般我们采用 ping 的方式返回型号的强度和稳定程度。

dart_ping 包

https://pub-web.flutter-io.cn/packages/dart_ping

ios dart_ping 包

https://pub-web.flutter-io.cn/packages/dart_ping_ios

ios 需要单独去设置

Ping 知识点

Ping 是一种常用的网络工具,用于测试网络设备之间的连通性和延迟。Ping 工具通过向目标设备发送一个 ICMP Echo Request 数据包,然后等待目标设备返回一个 ICMP Echo Reply 数据包,来检测目标设备的可达性和延迟。以下是关于 Ping 工具的一些重要信息:

作用:

  • 测试网络设备之间的连通性和延迟
  • 发现网络故障和嗅探网络拓扑结构
  • 验证网络性能和带宽

性能指标:

  • 延迟(Latency):指的是从发送一个数据包到接收到相应数据包所需的时间。
  • 丢包率(Packet Loss Rate):指的是在发送和接收数据包之间丢失的数据包的比例。
  • 带宽(Bandwidth):指的是网络中可用的数据传输速率,通常以比特/秒(bps)为单位。

如何判断:

  • 延迟:通常使用 Ping 工具的平均延迟来判断网络连接的延迟状况,如果延迟较高,可能会影响网络应用程序的性能。
  • 丢包率:如果 Ping 工具返回的丢包率较高,可能意味着网络连接不稳定,可能会影响网络应用程序的可靠性。
  • 带宽:如果 Ping 工具返回的延迟比较高,可能意味着网络瓶颈,可能会影响网络应用程序的带宽和性能。

步骤

第一步:导包,加入图片素材

pubspec.yaml

dart_ping 包

dependencies:
  flutter:
    sdk: flutter
 ...

  dart_ping: ^8.0.1

图片

  assets:
    - assets/images/

第二步:ping 业务实现

lib/ping.dart

成员变量

  // 检测域名
  final String _domain = 'baidu.com';
  // 信号量
  int _signalStrength = 0;
  // 返回信息
  String _resString = '';

ping 操作执行

  // 执行 ping
  void _doPing() {
    _resString = 'ping $_domain \n\n';
    final ping = Ping(_domain, count: 20);
    ping.stream.listen((event) {
      print(event);

      if (event.error != null) {
        // 错误
        setState(() {
          _resString = event.error.toString();
        });
      } else {
        if (event.response != null) {
          // 单次信息
          setState(() {
            _resString += '${event.response}\n';
          });

          // 信号强度
          _signalStrength = calculateSignalStrength(
              event.response?.time?.inMilliseconds ?? 0);
        }

        // 总计
        if (event.summary != null) {
          setState(() {
            _resString += '\n${event.summary}\n';
          });
        }
      }
    });
  }

信号强度

  // 信号强度 0 ~ 5 , 5 最好,0 最差
  int calculateSignalStrength(int pingDelay) {
    if (pingDelay < 0) {
      // 无网络连接
      return 0;
    } else if (pingDelay < 100) {
      // 延迟 < 100ms,信号强度为 5
      return 5;
    } else if (pingDelay < 200) {
      // 延迟 < 200ms,信号强度为 4
      return 4;
    } else if (pingDelay < 300) {
      // 延迟 < 300ms,信号强度为 3
      return 3;
    } else if (pingDelay < 500) {
      // 延迟 < 500ms,信号强度为 2
      return 2;
    } else {
      // 延迟 >= 500ms,信号强度为 1
      return 1;
    }
  }

视图

  Widget _mainView() {
    return Center(
      child: Column(
        children: [
          ElevatedButton(
            onPressed: _doPing,
            child: const Text('Start Ping'),
          ),
          Text('信号强度: $_signalStrength'),
          Text(_resString),
        ],
      ),
    );
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Ping'),
      ),
      body: _mainView(),
    );
  }

第三步:用图片显示信号强度

信号图片

  // 信号强度图片
  Widget _buildSignalIcon(BuildContext context) {
    String iconAsset = 'assets/images/signal-$_signalStrength.png';
    return Image.asset(
      iconAsset,
      width: 28,
      height: 28,
      fit: BoxFit.fill,
    );
  }
  Widget _mainView() {
    return Center(
      child: Column(
        children: [
          ...
          _buildSignalIcon(context),
          ...
        ],
      ),
    );
  }

代码

https://github.com/ducafecat/flutter_develop_tips/tree/main/flutter_application_ping

小结

总之,Ping 工具是一种简单而有效的网络工具,可以帮助用户测试网络连通性和性能,及时发现和解决网络问题。请在网路应用 Flutter 中开启这个功能~

感谢阅读本文

如果我有什么错?请在评论中让我知道。我很乐意改进。


© 猫哥 ducafecat.com

end

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1092.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debezium系列之:监控 Debezium 实例

Debezium系列之&#xff1a;监控 Debezium 实例 一、概述二、实现步骤三、执行四、打开Grafana UI五、关闭集群 Debezium JMX相关的技术博客&#xff1a; Debezium系列之&#xff1a;安装jmx导出器监控debezium指标Debezium系列之&#xff1a;为Debezium集群JMX页面增加监控&a…

「一本通 3.2 练习 6」汽车加油行驶

目录 第一步&#xff0c;二维转一维&#xff08;此步仅为方便&#xff0c;可以省略&#xff09; 第二步&#xff0c;建边&#xff08;啥都行&#xff0c;只要死不了&#xff09; 第三部&#xff0c;bfs&#xff08;你要dfs也行&#xff09; 第一步 第二步 第三步 可CA呢…

fatal error: ‘type_traits‘ file not found错误解决

错误如下 In file included from ../test_opencv_qt/main.cpp:1: In file included from ../../Qt/6.5.1/android_x86_64/include/QtGui/QGuiApplication:1: In file included from ../../Qt/6.5.1/android_x86_64/include/QtGui/qguiapplication.h:7: In file included from .…

在?聊聊浏览器事件循环机制

目录 前言 同步/异步编程模型 同步 异步 JS异步模型 调用栈 任务队列 宏任务队列 微任务队列 微任务API 事件循环 队列优先级 混合队列 事件循环实现 总结 参考文章 Event-Loop可视化工具 前言 JS是单线程语言&#xff0c;在某个时间段只能执行一段代码。这…

SpringBoot 实现 PDF 添加水印有哪些方案?

简介 PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种流行的文件格式&#xff0c;它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下&#xff0c;我们需要对 PDF 文件添加水印&#xff0c;以使其更具有辨识度或者保护其版…

.NET 8 Preview 4 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth - Principal Program Manager, ASP.NET 翻译&#xff1a;Alan Wang 排版&#xff1a;Alan Wang .NET 8 Preview 4 现已可用&#xff0c;并包括了许多对 ASP.NET Core 的新改进。 以下是本预览版本中的新内容摘要&#xff1a; Blazor 使用 Blazor …

【软考网络管理员】2023年软考网管初级常见知识考点(26)- HTML常见属性标签、表格、表单详解

涉及知识点 Html的概念&#xff0c;html常见标签&#xff0c;html常见属性&#xff0c;html表格&#xff0c;html表单&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码…

基于matlab使用 YOLO V2深度学习进行多类对象检测(附源码)

一、前言 此示例演示如何训练多类对象检测器。 深度学习是一种强大的机器学习技术&#xff0c;可用于训练强大的多类对象检测器&#xff0c;例如 YOLO v2、YOLO v4、SSD 和 Faster R-CNN。此示例使用该函数训练 YOLO v2 多类室内对象检测器。经过训练的物体检测器能够检测和识…

设计模式—“领域规则”

在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。 典型模式有:Interpreter Interpreter 动机 在软件构建过程中,如果某一个特定领域的问题比较复杂,类似的结构不断重复出现,…

SpringBoot + Vue前后端分离项目实战 || 五:用户管理功能后续

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 SpringBoot Vue前后端分离项目实战 || 二&#xff1a;Spring Boot后端与数据库连接 SpringBoot Vue前后端分离项目实战 || 三&#xff1a;Spring Boot后端与Vue前端连接 SpringBoot V…

数字图像处理(三)

目录 实验六、图像分割方法 实验七、图像识别与分类 实验六、图像分割方法 一、实验目的 了解图像分割技术相关基础知识&#xff1b;掌握几种经典边缘检测算子的基本原理、实现步骤理解阈值分割、区域分割等的基本原理、实现步骤。理解分水岭分割方法的基本原理、实现方法。…

在 Mac 上安装 K8S

本篇文章将介绍如何在 Mac 上使用 minikube 搭建单机版的 Kubernetes。 安装步骤 安装 Docker 安装 docker 主要是用于提供容器引擎。直接下载安装即可。 下载地址 安装 Kubectl 推荐使用 home brew 安装 brew install kubectl可以使用下面的命令查看是否已经安装完毕 …