目录
约束与限制
使用当前网络打开一个URL链接
场景介绍
接口说明
开发步骤
使用当前网络进行Socket数据传输
场景介绍
接口说明
开发步骤
使用指定网络进行数据访问
场景介绍
接口说明
开发步骤
流量统计
场景介绍
接口说明
开发步骤
管理HTTP缓存
场景介绍
接口说明
开发步骤
HarmonyOS网络管理模块主要提供以下功能:
- 数据连接管理:网卡绑定,打开URL,数据链路参数查询。
- 数据网络管理:指定数据网络传输,获取数据网络状态变更,数据网络状态查询。
- 流量统计:获取蜂窝网络、所有网卡、指定应用或指定网卡的数据流量统计值。
- HTTP缓存:有效管理HTTP缓存,减少数据流量。
- 创建本地套接字:实现本机不同进程间的通信,目前只支持流式套接字。
约束与限制
使用网络管理模块的相关功能时,需要请求相应的权限。
权限名 | 权限描述 |
---|
ohos.permission.GET_NETWORK_INFO | 获取网络连接信息。 |
ohos.permission.SET_NETWORK_INFO | 修改网络连接状态。 |
ohos.permission.INTERNET | 允许程序打开网络套接字,进行网络连接。 |
使用当前网络打开一个URL链接
场景介绍
应用使用当前的数据网络打开一个URL链接。
接口说明
应用使用当前网络打开一个URL链接,所使用的接口说明如下。
表1?网络管理功能的主要接口
类名 | 接口名 | 功能描述 |
---|
NetManager | getInstance(Context context) | 获取网络管理的实例对象。 |
hasDefaultNet() | 查询当前是否有默认可用的数据网络。 |
getDefaultNet() | 获取当前默认的数据网络句柄。 |
addDefaultNetStatusCallback(NetStatusCallback callback) | 获取当前默认的数据网络状态变化。 |
setAppNet(NetHandle netHandle) | 应用绑定该数据网络。 |
NetHandle | openConnection(URL url, java.net.Proxy proxy) throws IOException | 使用该网络打开一个URL链接。 |
开发步骤
- 调用NetManager.getInstance(Context)获取网络管理的实例对象。
- 调用NetManager.getDefaultNet()获取默认的数据网络。
- 调用NetHandle.openConnection()打开一个URL。
- 通过URL链接实例访问网站。
- 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数据传输,所使用的接口说明如下。
表1?网络管理功能的主要接口
类名 | 接口名 | 功能描述 |
---|
NetHandle | getByName(String host) | 解析主机名,获取其IP地址。 |
bindSocket(Socket socket) | 绑定Socket到该数据网络。 |
bindSocket(DatagramSocket socket) | 绑定DatagramSocket到该数据网络。 |
开发步骤
- 调用NetManager.getInstance(Context)获取网络管理的实例对象。
- 调用NetManager.getDefaultNet()获取默认的数据网络。
- 调用NetHandle.bindSocket()绑定网络。
- 使用socket发送数据。
- 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接口来使用指定网络进行数据传输。在进行数据传输前,需要先建立自定义的网络类型。
接口说明
应用使用指定网络进行数据访问,所使用的接口说明如下。
表1?网络管理功能的主要接口
类名 | 接口名 | 功能描述 |
---|
NetSpecifier | Builder() | 创建一个指定网络实例。 |
NetManager | setupSpecificNet(NetSpecifier netSpecifier, NetStatusCallback callback) | 建立指定的数据网络。 |
removeNetStatusCallback(NetStatusCallback callback) | 停止获取数据网络状态。 |
开发步骤
- 调用NetSpecifier.Builder()构建指定数据网络的实例。
- 调用NetManager.setupSpecificNet()建立数据网络,通过callback获取网络状态变化。
- 进行数据发送。
- 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提供。
表1?DataFlowStatistics的主要接口
接口名 | 功能描述 |
---|
getCellularRxBytes() | 获取蜂窝数据网络的下行流量。 |
getCellularTxBytes() | 获取蜂窝数据网络的上行流量。 |
getAllRxBytes() | 获取所有网卡的下行流量。 |
getAllTxBytes() | 获取所有网卡的上行流量。 |
getUidRxBytes(int uid) | 获取指定UID的下行流量。 |
getUidTxBytes(int uid) | 获取指定UID的上行流量。 |
getIfaceRxBytes(String nic) | 获取指定网卡的下行流量。 |
getIfaceTxBytes(String nic) | 获取指定网卡的上行流量。 |
开发步骤
调用DataFlowStatistics的接口可进行流量统计,以统计指定应用进程的流量为例。
- long rx = DataFlowStatistics.getUidRxBytes(uid);
- long tx = DataFlowStatistics.getUidTxBytes(uid);
- // 进行数据收发
- // 统计流量
- rx = DataFlowStatistics.getUidRxBytes(uid) - rx;
- tx = DataFlowStatistics.getUidTxBytes(uid) - tx;
管理HTTP缓存
场景介绍
应用重复打开一个相同网页时,可以优先从缓存文件里读取内容,从而减少数据流量,降低设备功耗,提升应用性能。
接口说明
管理HTTP缓存的功能主要由HttpResponseCache类提供。
表1?HttpResponseCache的主要接口
接口名 | 功能描述 |
---|
install(File directory, long size) | 使能HTTP缓存,设置缓存保存目录及大小。 |
getInstalled() | 获取缓存实例。 |
flush() | 立即保存缓存信息到文件系统中。 |
close() | 关闭缓存功能。 |
delete() | 关闭并清除缓存内容。 |
开发步骤
- 配置缓存目录及最大缓存空间。
- 保存缓存。
- 关闭缓存。
- // 初始化时设置缓存目录dir及最大缓存空间
- HttpResponseCache.install(dir, 10 * 1024 * 1024);
- // 访问URL
- // 为确保缓存保存到文件系统可以执行flush操作
- HttpResponseCache.getInstalled().flush();
- // 结束时关闭缓存
- HttpResponseCache.getInstalled().close();