网络相关知识

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
  • 三、相关工具
    • 3.1 network profiler/ Inspector
    • 3.2 抓包工具
    • 3.3 三方库 stetho
    • 3.4 通过 TrafficStats 来统计流量
    • 3.5 通过 NetworkStatsManager 来统计流量
  • 四、优化
  • 五、 推荐阅读

在这里插入图片描述

一、导读

我们继续总结学习基础知识,温故知新。

本文主要讲述网络优化相关的概念及思路。

HTTP即超文本传输协议(HyperText Transfer Protocol) 是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应(百度百科)。

二、概览

针对网络优化的维度比较多,可以从多方面入手,
比如流量使用情况(单位时间内流量消耗,用户网络类型,是否前后台等),
添加流量监控,最好从请求开始到结束的完整流程。
再比如网络请求的成功率、请求速度等等。

网络的测试,细节会比较多,我们要充分的进行线下测试,并进行多维度的模拟,如弱网、无网、网络切换等。
为了更精准的测试我们app的流量,可以在设置里面将其他app联网权限关闭。

对于线上用户监控,在客户端,也要多维度监控,尽可能多的获取信息,以便排查问题,要获取到接口的每一步详细信息,
如某个接口的dns解析时间,连接时间、请求时间,请求状态,网络包大小,网络状态等等,再配合用户日志系统,进行统一收集展示。

三、相关工具

3.1 network profiler/ Inspector

目前,网络性能剖析器仅支持 HttpURLConnection 和 OkHttp 网络连接库
在新包的android studio profiler上已经移除,在新的菜单中。
打开方式如下: View > Tool Windows > App Inspection

如下图所示:
在这里插入图片描述

这个工具会实时显示网络活动,包括发送、接受的数据及连接数、状态等。

使用方式大家自行学习吧,比较简单。
官网链接

3.2 抓包工具

要熟悉一些抓包工具,如
charles
fidder

工具的使用请自行学习。

3.3 三方库 stetho

stetho是facebook开发的一个开源库,Android应用通过引入stetho,可以在Chrome/Chromium浏览器监控查看网络请求、数据库、SharedPreferences、UI布局层级等.

chrome://inspect/

Stetho库的地址:

工具的使用请自行学习。

3.4 通过 TrafficStats 来统计流量

我们使用 android.net.TrafficStats 类 来统计流量,
这个类只在api 18 以上才有,用来统计手机重启以来的流量使用情况。

其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析。
android.net.TrafficStats类中,提供了多种静态方法,可以直接调用获取,返回类型均为 long型,如果返回等于-1代表 UNSUPPORTED 当前设备不支持统计。

static long  getMobileRxBytes()    //获取通过Mobile连接收到的字节总数,不包含WiFi  
static long  getMobileRxPackets()  //获取Mobile连接收到的数据包总数  
static long  getMobileTxBytes()    //Mobile发送的总字节数  
static long  getMobileTxPackets()  //Mobile发送的总数据包数  
static long  getTotalRxBytes()     //获取总的接受字节数,包含Mobile和WiFi等  
static long  getTotalRxPackets()   //总的接受数据包数,包含Mobile和WiFi等  
static long  getTotalTxBytes()     //总的发送字节数,包含Mobile和WiFi等  
static long  getTotalTxPackets()   //发送的总数据包数,包含Mobile和WiFi等   
static long  getUidRxBytes(int uid)  //获取某个网络UID的 接受 字节数  
static long  getUidTxBytes(int uid)  //获取某个网络UID的 发送字节数  

我们可以间隔一段时间读取一下使用的流量,

    public void start() {
        uid = Process.myUid();
        thread = new HandlerThread("123");
        thread.start();
        handler = new Handler(thread.getLooper()) {
            @Override
            public void handleMessage(@NonNull Message msg) {
                if (msg.what == 1) {
                    
                    // TODO:  比如计算一下差值
                    handler.sendEmptyMessageDelayed(1, 5 * 60 * 1000);
                }
            }
        };
        handler.sendEmptyMessageDelayed(1, 5 * 60 * 1000);

    }

(1)无法获取应用的数据流量消耗
从文档中仅能获取到指定uid的流量,但无法区分不同网络类型下的消耗
(2)无法获取某个时间段内的流量消耗

3.5 通过 NetworkStatsManager 来统计流量

精准统计流量消耗的方法
可以获取指定时间间隔内的流量消耗。

NetworkCapabilities.TRANSPORT_WIFI

NetworkStatsManager networkStatsManager = (NetworkStatsManager) getSystemService(NETWORK_STATS_SERVICE);

//查询 指定网络类型 在 某时间间隔内 的总的流量统计信息
NetworkStats.Bucket querySummaryForDevice(int networkType, String subscriberId, long startTime, long endTime)

 //查询某uid在 指定网络类型 和 时间间隔内 的流量统计信息
NetworkStats queryDetailsForUid(int networkType, String subscriberId, long startTime, long endTime, int uid)  

//查询 指定网络类型 在 某时间间隔内 的详细的流量统计信息(包括每个uid)
NetworkStats queryDetails(int networkType, String subscriberId, long startTime, long endTime) 

需要添加权限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>

使用


    @RequiresApi(api = Build.VERSION_CODES.M)
    public static long getNetStats(@NonNull Context context, long startTime, long endTime, int netType) {
        // 接收的流量
        long netDataReceive = 0;

        // 发送的流量
        long netDataSend = 0;
        String subId = null;

        // 通过 service获取
        NetworkStatsManager manager = (NetworkStatsManager) context.getApplicationContext().
                getSystemService(Context.NETWORK_STATS_SERVICE);

        if (manager == null) {
            return 0;
        }
        NetworkStats networkStats = null;
        NetworkStats.Bucket bucket = new NetworkStats.Bucket();
        try {
            // //查询 指定网络类型,  在 某时间间隔内 的总的流量统计信息
            networkStats = manager.querySummary(netType, subId, startTime, endTime);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //查询某应用(uid)的数据流量统计信息
        while (networkStats != null && networkStats.hasNextBucket()) {
            networkStats.getNextBucket(bucket);
            int uid = bucket.getUid();
            if (getAppUid(context) == uid) {
                // 接收的流量
                netDataReceive += bucket.getRxBytes();
                
                // 发送的流量
                netDataSend += bucket.getTxBytes();
            }
        }
        // 返回总流量, 这个量跟在设置里面看应该是差不多的
        return (netDataReceive + netDataSend);
    }

这个方式在线上排查问题还是有用的,比如我们可以获取用户昨天的流量消耗情况,这些信息一起写入用户行为日志中,进行辅助排查。

这个时候最好带上用户所处的状态,比如是否在前后台等等。

前后台流量消耗统计
当然,我们也可启用定时任务,如TrafficStats获取流量的方式,隔一段时间记录一次,并且区分前后台,然后统一上报。

网络请求流量优化

四、优化

在应用内使用网络的情况非常多,比如各种功能接口api,图片,日志等,那么我们要优化的话,可以从下面几个方面入手。

  • 数据缓存,一些不常用的数据进行网络缓存,设定过期时间。
  • 增量更新,根据版本进行更新。
  • 数据压缩,如gzip。
  • 图片处理,进行压缩

页面打不开、打开慢、图片加载不出来等等大部分都是由于网络加载慢,请求成功率低导致。
我们先来看下http请求的流程,
图片来源网络
在这里插入图片描述

dns被劫持,或者dns解析速度慢,都是导致网络慢,所以要防劫持,可以使用httpdns,绕过运营商域名解析,我们稍微解释下 httpdns,
HTTPDNS是面向多端应用(移动端APP,PC客户端应用)的域名解析服务,具有域名防劫持、精准调度、实时解析生效的特性。

其工作流程是这样的:图片来源于 阿里dns文章
在这里插入图片描述

使用httpdns可以降低平均访问时长,提高链接成功率,防止劫持。

尽量使用最新版的http协议,里面有很多的网络优化。

另外我们自己需要统计一下接口请求耗时,成功率,错误码等等,通过okhttp 的eventlistener就可以实现,如果是其他的网络链接,可自行调研。


public class OkHttpEventListener extends EventListener {

    @Override
    public void callStart(Call call) {
        super.callStart(call);
    }

    @Override
    public void dnsStart(Call call, String domainName) {
        super.dnsStart(call, domainName);
    }

    @Override
    public void dnsEnd(Call call, String domainName, List<InetAddress> inetAddressList) {
        super.dnsEnd(call, domainName, inetAddressList);
    }


    @Override
    public void responseBodyStart(Call call) {
        super.responseBodyStart(call);
    }

    @Override
    public void responseBodyEnd(Call call, long byteCount) {
        super.responseBodyEnd(call, byteCount);
    }

    @Override
    public void callEnd(Call call) {
        super.callEnd(call);
    }

    @Override
    public void callFailed(Call call, IOException ioe) {
        super.callFailed(call, ioe);
    }
    
    ...
}

我们可以看到,里面有很多的回调,在对应的方法里面计算时间差,就可以算出请求时间。

而对于图片监控来说, 如果使用的是 Fresco ,则直接可以使用sdk提供的方法来做监控,在内部有一个
com.facebook.imagepipeline.listener.RequestListener,类 ,可以监控到具体的每一步。
我们只需要在fresco初始化时,设置一个监听即可


        ImagePipelineConfig config = ImagePipelineConfig
                .newBuilder(mContext)
                .setRequestListeners(listenerset) // 设置监听
                .setRequestListener2s()           // 设置监听
                .build();
        Fresco.initialize(mContext,config);

通过接口,可以拿到成功失败及失败原因,

public interface RequestListener2 extends ProducerListener2 {

  void onRequestStart(ProducerContext producerContext);

  void onRequestSuccess(ProducerContext producerContext);

  void onRequestFailure(ProducerContext producerContext, Throwable throwable);

  void onRequestCancellation(ProducerContext producerContext);
}

如果是其他的图片加载库,可自行调研。

最后,针对服务端,需要做好网络容灾方案。

五、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

ddd

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

休息日的思考与额外题——链表

文章目录 前言链表知识点 一、 92. 反转链表 II二、21. 合并两个有序链表总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子哥的刷题班&#xff0c;训练…

构建知识图谱:从技术到实战的完整指南

目录 一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图数据库选择Neo4jArangoDB 构建流程数据预处理实体关系识别图…

详谈掼蛋两大类牌型

掼蛋中的10种牌型&#xff0c;总体上可以分为炸弹牌型系列和普通牌型两大类。炸弹牌型系列包括天王炸、同花顺和多头炸3大类&#xff1b;普通牌型系列包括单张、对子、三同张、三带二、顺子、三连对、连三张等7种牌型。 一、两类牌型的区别 炸弹牌型系列和普通牌型系列两大类有…

信创条件下的运维思考-驱动数字化转型,塑造企业未来之篇章

2024-01-14 12:59 发布于&#xff1a;山西省 运维信创&#xff1a;驱动数字化转型&#xff0c;塑造企业未来之篇章 随着信息技术的迅猛发展&#xff0c;数字化转型已成为企业生存和发展的必由之路。在数字化转型的过程中&#xff0c;运维作为企业IT的重要组成部分&#xff…

【安装指南】HBuilder X 下载、安装详细教程

目录 &#x1f33a;1. 概述 &#x1f33b;2. HBuilder X 安装包下载 &#x1f33c;3. 安装详细教程 &#x1f33a;1. 概述 HBuilder X 是一款由DCloud开发的基于Electron框架的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Web和移动应用程序的开发。以下是…

【自媒体实战】——公众号排版工具调研

公众号排版工具 壹伴 地址&#xff1a;https://yiban.io/ 网站 壹伴 (https://yiban.io/) 主要提供一个高效的微信编辑器&#xff0c;专门服务于公众号运营者。它包括了一系列工具和功能&#xff0c;旨在帮助用户更便捷地进行文章排版、图片编辑、素材寻找和消息回复等操作。…

web渗透测试-Server2225-(环境+解析)

1、访问目标IP,打开第1题,根据页面提示,将获取的flag提交。提交格式:flag{xxx}(提交花括号里面的字段) 给出了如上代码,很明显,flag在flag.php文件内。 REQUEST方法既可以接受GET方法,也可以接受POST方法,方便起见,我们选择GET方法。 eval函数 eval() 函数把字符串…

如何实现无公网ip远程SSH连接家中本地的树莓派

文章目录 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址4.5 ssh公网…

防御保护第四次作业

防火墙的智能选路 就近选路 --- 我们希望在访问不同运营商的服务器是&#xff0c;通过对应运营商的链路。这样可以高 通信效率&#xff0c;避免绕路。 策略路由 -- PBR 传统的路由&#xff0c;仅基于数据包中的目标IP地址查找路由表。仅关心其目标&#xff0c;所以&#…

大模型:合成数据、安全挑战与知识注入

在如今这个快速发展的AI时代&#xff0c;大语言模型&#xff08;LLM&#xff09;的研究论文数量呈指数级增长&#xff0c;几乎到了人力无法一一阅读和消化的地步。然而&#xff0c;对这些研究成果的归纳和总结至关重要&#xff0c;因为它们描绘了LLM领域的未来发展轮廓。在近期…

变相体罚学生包括什么

有时候由于种种原因&#xff0c;一些老师可能会采用变相体罚的方式来对待学生&#xff0c;不仅会伤害学生的身心健康&#xff0c;还会影响学生的学习积极性和成绩。什么是变相体罚呢&#xff1f; 变相体罚是指不采用直接的身体惩罚方式&#xff0c;而是采用其他方式来惩罚学生…

3、css设置样式总结、节点、节点之间关系、创建元素的方式、BOM

一、css设置样式的方式总结&#xff1a; 对象.style.css属性 对象.className ‘’ 会覆盖原来的类 对象.setAttribut(‘style’,‘css样式’) 对象.setAttribute(‘class’,‘类名’) 对象.style.setProperty(css属性名,css属性值) 对象.style.cssText “css样式表” …

JMeter性能测试实战

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

基于YOLOv7算法和FLIR数据集的高精度实时红外行人目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法和FLIR数据集的高精度实时红外行人目标检测系统可用于日常生活中检测与定位自行车、汽车、狗和行人目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本…

数据库基础01-mysql和SQL语句

目录 一、关系型数据库 1.什么是关系型数据库 2.主要优点 二、SQL语句 1.简介&#xff1a; 2.SQL通用语法 3.SQL语法分类 4.DDL &#xff08;1&#xff09;查询库 &#xff08;2&#xff09;创建库 &#xff08;3&#xff09;删除库 &#xff08;4&#xff09;使用库…

Qt应用软件【协议篇】Modbus详细介绍

文章目录 概述Modbus 485协议概述在工业自动化中的应用 通信模式数据模型功能码 Modbus RTU示例 1&#xff1a;读取保持寄存器示例 2&#xff1a;写入单个线圈示例 3&#xff1a;写入多个保持寄存器报文传输 Modbus ASCII报文示例报文传输 Modbus TCP报文示例报文传输 概述 在…

在中国如何方便地使用GPT Plus?

一、背景 通过魔法&#xff0c;顺利登录ChatGPT&#xff0c;准备升级GPT Plus时&#xff0c;发现需要国外信用卡才能支付&#xff0c;这对大多数中国人来说是不方便的。在google搜索解决方案时&#xff0c;发现了WildCard平台&#xff0c;可以一键升级 GPT Plus (GPT-4)。将基…

浅谈隔离放大器

浅谈隔离放大器 定义&#xff1a;隔离放大器是将输入的电量信号或物理量信号通过一种技术手段处理后,隔离输出一组模拟量信号,这组模拟量信号是以标准的4-20mA/0-20mA/0-10mA/0-10V/0-5V/1-5V/2-10V/0-2.5V/0-20mA/0-10mA/0-10V/0-100mV/0-5V等信号,以便控制系统及仪器仪表设备…

【C语言】位操作符详解

目录 1、按位与&#xff08; & &#xff09; 2、按位或&#xff08; | &#xff09; 3.按位异或&#xff08; ^ &#xff09; C语言中的位操作符有以下&#xff1a; & | ^//按位与 //按位或 //按位异或 位运算符是计算两者之间的补码&#xff0c;然后得到的是计算后补…

【数模百科】如何提高数模论文的美观性(附美赛word和LaTeX模板)

有人说&#xff0c; 美赛 美术大赛 某种程度上是这样的。 「论文包装」是美赛的重中之重&#xff0c;如果大家有阅读过往年O奖论文&#xff0c;就会发现所有论文的「美观性」都很强。 比如这篇2019年的神作&#xff0c;花了条恐龙。 好的下面我来教大家如何画恐龙。&#…