HarmonyOS学习路之开发篇—网络与连接(网络管理)

2023-10-15 08:55:39 浏览数 (1)

网络管理开发概述

HarmonyOS网络管理模块主要提供以下功能:

  • 数据连接管理:网卡绑定,打开URL,数据链路参数查询。
  • 数据网络管理:指定数据网络传输,获取数据网络状态变更,数据网络状态查询。
  • 流量统计:获取蜂窝网络、所有网卡、指定应用或指定网卡的数据流量统计值。
  • HTTP缓存:有效管理HTTP缓存,减少数据流量。
  • 创建本地套接字:实现本机不同进程间的通信,目前只支持流式套接字。

约束与限制

使用网络管理模块的相关功能时,需要请求相应的权限。

权限名

权限描述

ohos.permission.GET_NETWORK_INFO

获取网络连接信息。

ohos.permission.SET_NETWORK_INFO

修改网络连接状态。

ohos.permission.INTERNET

允许程序打开网络套接字,进行网络连接。

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

场景介绍

应用使用当前的数据网络打开一个URL链接。

接口说明

应用使用当前网络打开一个URL链接,所使用的接口说明如下。

类名

接口名

功能描述

NetManager

getInstance(Context context)

获取网络管理的实例对象。

hasDefaultNet()

查询当前是否有默认可用的数据网络。

getDefaultNet()

获取当前默认的数据网络句柄。

addDefaultNetStatusCallback(NetStatusCallback callback)

获取当前默认的数据网络状态变化。

setAppNet(NetHandle netHandle)

应用绑定该数据网络。

NetHandle

openConnection(URL url, java.net.Proxy proxy) throws IOException

使用该网络打开一个URL链接。

开发步骤

  1. 调用NetManager.getInstance(Context)获取网络管理的实例对象。
  2. 调用NetManager.getDefaultNet()获取默认的数据网络。
  3. 调用NetHandle.openConnection()打开一个URL。
  4. 通过URL链接实例访问网站。
代码语言:javascript复制
NetManager netManager = NetManager.getInstance(context);

if (!netManager.hasDefaultNet()) {
    return;
}
NetHandle netHandle = netManager.getDefaultNet();

// 可以获取网络状态的变化
NetStatusCallback callback = new NetStatusCallback() {
    // 重写需要获取的网络状态变化的override函数
};
netManager.addDefaultNetStatusCallback(callback);

// 通过openConnection来获取URLConnection
HttpURLConnection connection = null;
try {
    String urlString = "EXAMPLE_URL"; // 开发者根据实际情况自定义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的其他操作
    }
} catch(IOException e) {
    HiLog.error(TAG, "exception happened.");
} finally {
    if (connection != null){
        connection.disconnect();
    }
}

使用当前网络进行Socket数据传输

场景介绍

应用使用当前的数据网络进行Socket数据传输。

接口说明

应用使用当前网络进行Socket数据传输,所使用的接口说明如下。

类名

接口名

功能描述

NetHandle

getByName(String host)

解析主机名,获取其IP地址。

bindSocket(Socket socket)

绑定Socket到该数据网络。

bindSocket(DatagramSocket socket)

绑定DatagramSocket到该数据网络。

开发步骤

  1. 调用NetManager.getInstance(Context)获取网络管理的实例对象。
  2. 调用NetManager.getDefaultNet()获取默认的数据网络。
  3. 调用NetHandle.bindSocket()绑定网络。
  4. 使用socket发送数据。
代码语言:javascript复制
NetManager netManager = NetManager.getInstance(context);

if (!netManager.hasDefaultNet()) {
    return;
}
NetHandle netHandle = netManager.getDefaultNet();

// 通过Socket绑定来进行数据传输
DatagramSocket socket = null;
try {
    InetAddress address = netHandle.getByName("www.EXAMPLE.com"); // 开发者根据实际情况自定义EXAMPLE_URL
    socket = new DatagramSocket();
    netHandle.bindSocket(socket);
    byte[] buffer = new byte[1024]; 
    DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, port); // port为连接UDP Socket时自行指定的端口
    // buffer赋值
   
    // 发送数据
    socket.send(request);
} catch(IOException e) {
    HiLog.error(TAG, "exception happened.");
}finally {
    if (socket != null) {
        socket.close();
    }
}

使用指定网络进行数据访问

场景介绍

应用可以调用API接口来使用指定网络进行数据传输。在进行数据传输前,需要先建立自定义的网络类型。

接口说明

应用使用指定网络进行数据访问,所使用的接口说明如下。

类名

接口名

功能描述

NetSpecifier

Builder()

创建一个指定网络实例。

NetManager

setupSpecificNet(NetSpecifier netSpecifier, NetStatusCallback callback)

建立指定的数据网络。

removeNetStatusCallback(NetStatusCallback callback)

停止获取数据网络状态。

开发步骤

  1. 调用NetSpecifier.Builder()构建指定数据网络的实例。
  2. 调用NetManager.setupSpecificNet()建立数据网络,通过callback获取网络状态变化。
  3. 进行数据发送。
代码语言:javascript复制
NetManager netManager = NetManager.getInstance(context);

private class MmsCallback extends NetStatusCallback {
    @Override
    public void onAvailable(NetHandle netHandle) {
        // 通过setAppNet把后续应用所有的请求都通过该网络进行发送
        netManager.setAppNet(netHandle);
        HttpURLConnection connection = null;
        try {
            String urlString = "EXAMPLE_URL"; // 开发者根据实际情况自定义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的其他操作
        } finally {
            if(connection != null){
                connection.disconnect();
            }
        }
        
        // 如果业务执行完毕,可以停止获取
        netManager.removeNetStatusCallback(this);
    }
}

MmsCallback callback = new MmsCallback();

// 配置一个彩信类型的蜂窝网络
NetSpecifier req = new NetSpecifier.Builder()
    .addCapability(NetCapabilities.NET_CAPABILITY_MMS)
    .addBearer(NetCapabilities.BEARER_CELLULAR)
    .build();

// 建立数据网络,通过callback获取网络变更状态
netManager.setupSpecificNet(req, callback);

流量统计

场景介绍

应用通过调用API接口,可以获取蜂窝网络、所有网卡、指定应用或指定网卡的数据流量统计值。

接口说明

应用进行流量统计,所使用的接口主要由DataFlowStatistics提供。

接口名

功能描述

getCellularRxBytes()

获取蜂窝数据网络的下行流量。

getCellularTxBytes()

获取蜂窝数据网络的上行流量。

getAllRxBytes()

获取所有网卡的下行流量。

getAllTxBytes()

获取所有网卡的上行流量。

getUidRxBytes(int uid)

获取指定UID的下行流量。

getUidTxBytes(int uid)

获取指定UID的上行流量。

getIfaceRxBytes(String nic)

获取指定网卡的下行流量。

getIfaceTxBytes(String nic)

获取指定网卡的上行流量。

开发步骤

调用DataFlowStatistics的接口可进行流量统计,以统计指定应用进程的流量为例。

代码语言:javascript复制
long rx = DataFlowStatistics.getUidRxBytes(uid);
long tx = DataFlowStatistics.getUidTxBytes(uid);

// 进行数据收发

// 统计流量
rx = DataFlowStatistics.getUidRxBytes(uid) - rx;
tx = DataFlowStatistics.getUidTxBytes(uid) - tx;

管理HTTP缓存

场景介绍

应用重复打开一个相同网页时,可以优先从缓存文件里读取内容,从而减少数据流量,降低设备功耗,提升应用性能。

接口说明

管理HTTP缓存的功能主要由HttpResponseCache类提供。

接口名

功能描述

install(File directory, long size)

使能HTTP缓存,设置缓存保存目录及大小。

getInstalled()

获取缓存实例。

flush()

立即保存缓存信息到文件系统中。

close()

关闭缓存功能。

delete()

关闭并清除缓存内容。

开发步骤

  1. 配置缓存目录及最大缓存空间。
  2. 保存缓存。
  3. 关闭缓存。
代码语言:javascript复制
// 初始化时设置缓存目录dir及最大缓存空间
HttpResponseCache.install(dir, 10 * 1024 * 1024);

// 访问URL

// 为确保缓存保存到文件系统可以执行flush操作
HttpResponseCache.getInstalled().flush();

// 结束时关闭缓存
HttpResponseCache.getInstalled().close();

0 人点赞