HarmonyOS学习路:开发篇—网络和连接网络管理
网络管理开发概述
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 {
-
-
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的接口可进行流量统计,以统计指定应用进程的流量为例。
-
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();
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfgifie
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24