DevEco-网络管理开发(笔记)

一、基本格式

应用使用当前网络打开一个URL链接

会用到多线程操作,参看《线程管理开发指导-线程管理-Ability框架-开发-HarmonyOS应用开发》

 布局

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <Button
        ohos:id="$+id:but1"
        ohos:width="match_content"
        ohos:height="match_content"
        ohos:text="访问网络"
        ohos:text_size="20vp"
        ohos:background_element="lightblue"
        />

</DirectionalLayout>
package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.app.dispatcher.TaskDispatcher;
import ohos.app.dispatcher.task.TaskPriority;
import ohos.net.NetHandle;
import ohos.net.NetManager;
import ohos.net.NetStatusCallback;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;

public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        Button but = findComponentById(ResourceTable.Id_but1);
        but.setClickedListener(component -> {
            //发送网络请求,但是我们不可以直接在onStart中进行网络访问
            //否则程序启动时 ,会提示错误“不能在主线程中进行网络访问”
            //因为不能在主线程中进行耗时的程序
            //我们此处申请一个全局线程
            //我们用一个线程去做,优先级我们设置为,默认任务优先级, 比低优先级的任务有更高的几率得到执行
            TaskDispatcher globalTaskDispathcer = this.getGlobalTaskDispatcher(TaskPriority.DEFAULT);
            //syncDispatch:同步调用
            //asyncDispatch:异步调用
            //此处写一个匿名方法
            globalTaskDispathcer.asyncDispatch(()->{
                //从官网复制
                //获取网络管理的实例对象,实例就是此处的上下文(对象的环境、属性、定义等信息)
                NetManager netManager = NetManager.getInstance(this);

                if (!netManager.hasDefaultNet()) {//无网络则终止
                    return;
                }
                //获取默认的数据网络
                NetHandle netHandle = netManager.getDefaultNet();
                // 可以获取网络状态的变化,可以通过它来提示网络状态变化
                //回调,意味着网络状态变化,自动执行
                //重写,需要重写获取网络变化的
                NetStatusCallback callback = new NetStatusCallback() {
                    // 重写需要获取的网络状态变化的override函数
                };
                //将回调函数设置
                netManager.addDefaultNetStatusCallback(callback);

                // 通过openConnection来获取URLConnection
                HttpURLConnection connection = null;
                try {
                    String urlString = "https://www.baidu.com"; // 开发者根据实际情况自定义EXAMPLE_URL
                    URL url = new URL(urlString);
                    //封装成网络对象,即封装成包
                    URLConnection urlConnection = netHandle.openConnection(url, java.net.Proxy.NO_PROXY);
                    if (urlConnection instanceof HttpURLConnection) {//判定是否有继承关系,即可以转换
                        connection = (HttpURLConnection) urlConnection;
                        connection.setRequestMethod("GET");//请求方式
                        connection.connect();//执行链接
                        // 之后可进行url的其他操作
                        //获取输入流,读取接口返回的数据
                        if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
                            //由于我们不知道后端会返回多少数据
                            InputStream is = connection.getInputStream();//创建输入流
                            StringBuilder builder = new StringBuilder();
                            byte[] bs = new byte[1024];//以字节形式存储数据,1024 B = 1 MB
                            int len = -1;
                            while((len = is.read(bs))!=-1 ){
                                builder.append(new String(bs,0,len));
                            }
                            String result = builder.toString();
                            System.out.println("______________________:"+result);
                        }
                    }
                } catch (ProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e){
                    e.printStackTrace();
                }
                finally {
                    if (connection != null){
                        connection.disconnect();
                    }
                }
            });
        });
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

注意 

默认只能访问https接口,如果要访问config.json,我们需要在deviceConfig中添加如下代码

二、封装成方法 

我们可以创建一个包,名字叫做util

在内中我们可以定义一个java类,叫做HttpRequestUtil 

package com.example.myapplication.util;

import ohos.app.Context;

import ohos.net.NetHandle;
import ohos.net.NetManager;
import ohos.net.NetStatusCallback;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;

public class HttpRequestUtil {
    //上下文,网络路径(统一资源定位),请求方式(GET,POST,DELETE,PUT),请求参数(访问受限制资源时携带的token,非受限时用可null),请求体传递数据(当请求方式为PUT/POST时,要满足json格式)
    public static String sendRequest(Context context,String urlString,String requestMethod,String token,String data){
        String result = null;
        System.out.println("------------------------开始建立数据包!\n");

        NetManager netManager = NetManager.getInstance(context);

        if (!netManager.hasDefaultNet()) {
            return result;
        }

        NetHandle netHandle = netManager.getDefaultNet();

        NetStatusCallback callback = new NetStatusCallback() {

            };

        netManager.addDefaultNetStatusCallback(callback);

        HttpURLConnection connection = null;
        try {
            URL url = new URL(urlString);
            URLConnection urlConnection = netHandle.openConnection(url, java.net.Proxy.NO_PROXY);
            if (urlConnection instanceof HttpURLConnection) {
                connection = (HttpURLConnection) urlConnection;
                connection.setRequestMethod(requestMethod);
                //如果数据包不为空,且为两种请求方式之一
                if(data!=null && ( "put".equalsIgnoreCase(requestMethod) || "post".equalsIgnoreCase(requestMethod))){
                    //允许通过此网络连接向服务器写数据
                    connection.setDoOutput(true);
                    //将内容指定为JSON格式,并以UTF-8字符编码进行编码,传给服务器("文本类型","json;编码格式")
                    connection.setRequestProperty("Content-Type","application/json;charset=utf-8");
                }
                //将token放入数据包中
                if(token!=null){
                    connection.setRequestProperty("token", token);
                }
                System.out.println("------------------------正在建立连接!\n");
                connection.connect();
                //像服务器传递data中数据
                if(data!=null && ( "put".equalsIgnoreCase(requestMethod) || "post".equalsIgnoreCase(requestMethod))){
                    byte[] bytes = data.getBytes(StandardCharsets.UTF_8);//将data中数据以字节格式存储
                    OutputStream os = connection.getOutputStream();//创建流
                    os.write(bytes);//通过字节流的形式写入
                    os.flush();//清空缓冲区
                    os.close();
                }
                if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
                    System.out.println("------------------------成功获取结果!\n");
                    InputStream is = connection.getInputStream();
                    StringBuilder builder = new StringBuilder();
                    byte[] bs = new byte[1024];
                    int len = -1;
                    while((len = is.read(bs))!=-1 ){
                        builder.append(new String(bs,0,len));
                    }
                    result = builder.toString();
                }
            }
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
        finally {
            if (connection != null){
                connection.disconnect();
            }
            return result;
        }
    }
}

 三、第三方依赖的引入

我们可以引入第三方依赖,来很方便的读写Json。找到build.gradle(entry下)

在此处给出依赖坐标即可 

比如添加如下gson依赖 

最后让gradle同步即可 

 

参考文献

  1. 《网络管理开发概述-网络管理-网络与连接-开发-HarmonyOS应用开发》
  2. ​​《全网首套鸿蒙HarmonyOS 2.0应用开发实战教程丨锋迷商城项目,鸿蒙系统APP开发入门+实战教学_哔哩哔哩_bilibili》
第一章 网络管理概述 1.1 什么是计算机网络 1.2 网络管理者的职责 1.3 网络管理网络管理系统 1.4 网络的5个功能域 1.4.1 失效管理 1.4.2 配置管理 1.4.3 安全管理 1.4.4 性能管理 1.4.5 计费管理 1.5 管理模型 1.6 小结 第二章 网络管理协议 2.1 没有网络管理协议前的情况 2.2 网络管理协议的发展 2.3 几种标准网络管理协议 2.3.1 SNMP 2.3.2 CMIS/CMIP 2.3.3 CMOT 2.3.4 LMMP 2.4 管理信息库 2.4.1 ASN.1语法 2.4.2 MIB树的结构 2.5 小结 第三章 简单网络管理协议SNMP 3.1 SNMP的工作原理 3.2 安全识别及排序 3.2.1 列对象 3.2.2 模糊的行区分的问题 3.2.3 概念表和行对象 3.2.4 标题对象 3.2.5 按字典排序 3.3 SNMP协议数据单元 3.3.1 SNMP PDU的格式 3.3.2 SNMP消息的传输 3.3.3 SNMP消息的接收 3.3.4 变量束 3.3.5 GetRequest PDU 3.3.6 GetNextRequest PDU 3.3.7 SetRequest PDU 3.3.8 Trap PDU 3.4 SNMP的安全机制 3.4.1 认证服务 3.4.2 访问策略 3.4.3 转换代理服务 3.5 管理信息库 3.5.1 系统组 3.5.2 接口组 3.5.3 地十转换组 3.5.4 IP组 3.5.5 ICMP组 3.5.6 TCP组 3.5.7 UDP组 3.5.8 EGP组 3.5.9 CMOT组 3.5.10 传输组 3.5.11 SNMP组 3.6 传输层的支持 3.6.1 无连接的传输服务 3.6.2 面向连接的传输服务 3.7 实际问题 3.7.1 在SNMP支持上的不同 3.7.2 不被支持的对象 3.7.3 查询频率 3.7.4 SNMP的局限性 3.8 小结 第四章 远程网络监视 4.1 RMON的目标 4.2 对远程监视器的控制 4.2.1 配置 4.2.2 支作发动 4.3 多管理者支持 4.4 表管理 4.4.1 文本约定 4.4.2 行增加 4.4.3 行更改和删去 4.5 RMON MIB 4.5.1 RMON MIB的结构 4.5.2 统计组 4.5.3 历史组 4.5.4 警报组 4.5.5 主机组 4.5.6 最高N台主机组 4.5.7 矩阵组 4.5.8 过滤组 4.5.9 包捕获组 4.5.10 事件组 4.6 实际问题 4.6.1 事件捕获过载 4.6.2 硬件平台 4.7 小结 第五章 安全SNMP 5.1 概述 5.1.1 安全威胁 5.1.2 S-SNMP的安全服务 5.1.3 S-SNMP的安全机制 5.2 管理模型 5.2.1 模型中的元素 5.2.2 模型的应用 5.3 安全性协议 5.3.1 S-SNMP消息 5.3.2 摘要认证协议 5.3.3 对称机密性协议 5.3.4 秘密值的发布 5.3.5 时间同步 5.4 小结 第六章 SNMP版本2(SNMPv2) 6.1 概述 6.1.1 SNMPv2的发展 6.1.2 对SNMP的增强 6.2 管理信息结构 6.2.1 SNMPv2中的对象定义 6.2.2 SNMPv2的表 6.3 SNMPv2的管理模型 6.3.1 MIB视域 6.3.2 SNMPv2的上下文 6.3.3 访问控制策略 6.3.4 上下文类型 6.3.5 模型的应用 6.4 协议操作 6.4.1 PDU的格式 6.4.2 GetRequest PDU 6.4.3 GeNextRequext PDU 6.4.4 GetBullkRequest PDU 6.4.5 SetRequest PDU 6.4.6 Trap PDU 6.4.7 InformRequest PDU 6.4.8 表操作 6.5 SNMPv2安全协议 6.5.1 有序传送机制 6.5.2 时钟同步算法 6.5.3 上下文信息 6.6 传输映射 6.7 小结 第七章 OSI系统管理的概念 7.1 OSI管理框架 7.2 OSI管理功能域 7.2.1 失效管理 7.2.2 计费管理 7.2.3 配置及名字管理 7.2.4 性能管理 7.2.5 安全管理 7.3 系统管理功能 7.4 小结 第八章 OSI管理信息库 8.1 管理信息模型 8.1.1 管理信息模型的基本概念 8.1.2 系统管理操作 8.2 管理信息的定义 8.2.1 一般性属性 8.2.2 物有属性 8.2.3 通告类型 8.2.4 被管理对象类 8.2.5 被管理对象定义模板 8.2.6 标识符的分配 8.3 实际问题 8.4 小结 第九章 公共管理信息服务和公共管理信息协议 9.1 公共管理信息服务 9.1.1 连接 9.1.2 选择被管理的对象 9.1.3 管理通告服务 9.1.4 管理操作服务 9.1.5 联系服务 9.2 公共管理信息协议 9.2.1 CMIP操作 9.2.2 远程操作服务元素(ROSE)的使用 9.3 实际问题 9.3.1 性能 9.3.2 协议体系结构 9.4 小结 第十章 网络管理系统 10.1 网络管理系统的结构 10.2 设计网络管理系统原原则 10.3 网络管理平台应用 10.3.1 SunNet Manager 10.3.2 PolyCenter On Netview(PNV) 10.3.3 SPECTRUM Enterprise Manager 10.3.4 如何选择网络管理平台 10.4 网络管理系统的发展趋势 10.5 基于Web的网络管理工具及系统 10.5.1 Advent We NMS及NetMonitor 10.5.2 JMAPI 10.6 小结 第十一章 失效管理 11.1 失效管理的内容 11.1.1 收集信息以发现故障 11.1.2 决定管理哪些失效 11.2 失效管理工具 11.2.1 简单工具 11.2.2 复杂工具 11.2.3 高级工具 11.3 失效结网络的影响 11.4 失效报告的开式 11.5 小结 第十二章 配置管理 12.1 配置管理的内容 12.1.1 收集数据 12.1.2 修改设备配置 12.1.3 存储信息 12.2 配置管理工具 12.2.1 简单工具 12.2.2 复杂工具 12.2.3 高级工具 12.3 产生配置报告 12.4 小结 第十三章 安全管理 13.1 安全管理的内容 13.1.1 确定敏感信息 13.1.2 找出访问点 13.1.3 保护访问点 13.1.4 维护安全访问点 13.2 安全管理工具 13.2.1 简单工具 13.2.2 复杂工具 13.2.3 高级工具 13.3 与公共网络相连时的安全问题 13.4 代理服务器(Proxy Server) 13.4.1 主要功能 13.4.2 基本配置方式和结构 13.5 安全事件报告 13.6 小结 第十四章 性能管理 14.1 性能管理的内容 14.1.1 收集使用数据 14.1.2 分析数据 14.1.3 设置阈值 14.1.4 使用网络模拟 14.2 性能管理工具 14.2.1 简单工具 14.2.2 复杂工具 14.2.3 高级工具 14.3 报告性能信息 14.4 小结 第十五章 计费管理 15.1 计费管理的内容 15.1.1 确定计费原则 15.1.2 收集有关网络使用情况的数据 15.1.3 设置定额 15.1.4 给用户开帐单 15.2 计费管理工具 15.2.1 简单工具 15.2.2 复杂工具 15.2.3 高级工具 15.3 报告计费信息 15.4 小结 第十六章 SNMP应用实例 16.1 UNIX系统下SNMP协议的应用 16.2 利用Java编写SNMP程序 16.2.1 Advent Java SNMP Package介绍 16.2.2 应用程序实例 16.2.3 小应用程序实例 16.3 小结 第十七章 清华大学校园网络综合管理系统 17.1 校园网络系统介绍 17.2 网络管理系统的整体结构 17.3 基于网管平台的管理功能 17.3.1 配置管理 17.3.2 失效管理 17.3.3 性能管理 17.4 基于Web的综合网络管理系统 17.4.1 性能管理 17.4.2 安全管理 17.4.3 计费管理 17.4.4 用户管理 17.4.5 内部管理 17.5 小结 参考文献
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值