网络管理开发概述
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链接。 |
开发步骤
- 调用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数据传输,所使用的接口说明如下。
类名 | 接口名 | 功能描述 |
---|---|---|
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接口来使用指定网络进行数据传输。在进行数据传输前,需要先建立自定义的网络类型。
接口说明
应用使用指定网络进行数据访问,所使用的接口说明如下。
类名 | 接口名 | 功能描述 |
---|---|---|
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提供。
接口名 | 功能描述 |
---|---|
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() | 关闭并清除缓存内容。 |
开发步骤
- 配置缓存目录及最大缓存空间。
- 保存缓存。
- 关闭缓存。
// 初始化时设置缓存目录dir及最大缓存空间
HttpResponseCache.install(dir, 10 * 1024 * 1024);
// 访问URL
// 为确保缓存保存到文件系统可以执行flush操作
HttpResponseCache.getInstalled().flush();
// 结束时关闭缓存
HttpResponseCache.getInstalled().close();