鸿蒙网络编程系列42-仓颉版域名解析示例

1. 域名解析简介

域名解析是网络开发中经常使用的功能之一,特别是对于当前版本的鸿蒙API,使用TCP或者UDP等网络协议通讯时,只能使用确定的IP地址进行绑定或者发送消息,还不支持直接使用域名,所以,通过域名解析得到对应的IP地址,然后再使用套接字进行通讯,可以避免使用者记录IP地址的困难。

在本系列的第15篇文章《鸿蒙网络编程系列15-域名解析示例》中,我们基于ArkTS语言在API 9的环境下演示了对网站域名进行解析的过程,本文将使用仓颉语言在API 12的环境中实现类似的功能。

鸿蒙封装的网络管理包,使用如下的方式导入:

javascript 复制代码
import ohos.net.connection.*

connection包和域名解析相关的函数主要是如下三个:

javascript 复制代码
//获取默认激活的数据网络。
1. public func getDefaultNet(): NetHandle

//NetHandle类的函数,使用对应网络解析主机名以获取所有IP地址。
2. public func getAddressesByName(host: String): Array<NetAddress>

//NetHandle类的函数,使用对应网络解析主机名以获取第一个IP地址。
3. public func getAddressByName(host: String): NetAddress

一个域名可能对应多个IP地址,如果只是获取域名对应的IP地址,可以使用getAddressByName函数,如果需要获取域名对应的所有IP地址,需要使用getAddressesByName函数,本文要演示解析域名的所有IP地址,所以使用的是getAddressByName。

2. 域名解析演示

本示例运行后的界面如图所示:

输入待解析的域名,然后单击"解析"按钮,即可进行解析,这里使用了百度和华为开发者社区的域名,解析结果如图所示:

可以看到,解析出了所有对应的IP地址。

3. 域名解析示例编写

下面详细介绍创建该示例的步骤(确保DevEco Studio已安装仓颉插件)。

步骤1:创建[Cangjie]Empty Ability项目。

步骤2:在module.json5配置文件加上对权限的声明:

json 复制代码
"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "ohos.permission.GET_NETWORK_INFO"
      }
    ]

这里添加了获取网络信息和访问互联网的权限。

步骤3:在build-profile.json5配置文件加上仓颉编译架构:

json 复制代码
"cangjieOptions": {
      "path": "./src/main/cangjie/cjpm.toml",
      "abiFilters": ["arm64-v8a", "x86_64"]
    }

步骤4:在index.cj文件里添加如下的代码:

javascript 复制代码
package ohos_app_cangjie_entry

import ohos.base.*
import ohos.component.*
import ohos.state_manage.*
import ohos.state_macro_manage.*
import std.collection.HashMap
import ohos.net.http.*
import ohos.net.connection.*
import std.collection.ArrayList

@Entry
@Component
class EntryView {
    //标题
    @State
    var title: String = "仓颉版域名解析示例"
    //连接、通讯历史记录
    @State
    var msgHistory: String = ''
    //登录地址
    @State
    var hostName: String = "www.baidu.com"

    let scroller: Scroller = Scroller()

    func build() {
        Row {
            Column {
                Text(title).fontSize(14).fontWeight(FontWeight.Bold).width(100.percent).textAlign(
                    TextAlign.Center).padding(10)

                Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {
                    Text("待解析域名:").fontSize(14)

                    TextInput(text: hostName).onChange({
                        value => hostName = value
                    }).width(100).fontSize(11).flexGrow(1)

                    Button("解析").onClick {
                        evt => resolveHost()
                    }.width(70).fontSize(14).flexGrow(0)
                }.width(100.percent).padding(10)

                Scroll(scroller) {
                    Text(msgHistory).textAlign(TextAlign.Start).padding(10).width(100.percent).backgroundColor(0xeeeeee)
                }.align(Alignment.Top).backgroundColor(0xeeeeee).height(300).flexGrow(1).scrollable(
                    ScrollDirection.Vertical).scrollBar(BarState.On).scrollBarWidth(20)
            }.width(100.percent).height(100.percent)
        }.height(100.percent)
    }

    //解析域名对应的IP地址
    func resolveHost() {
        //获取默认的激活网络
        let netHandle = getDefaultNet();

        var addrList = ArrayList<String>()
        //遍历解析后得到的每一个网络地址并去重
        for (netaddr in netHandle.getAddressesByName(this.hostName)) {
            if (!addrList.contains(netaddr.address)) {
                addrList.append(netaddr.address)
            }
        }
        this.msgHistory += "解析域名[${this.hostName}]的结果:\r\n"
        //输出去重后的IP地址
        for (addr in addrList) {
            this.msgHistory += "${addr}\r\n"
        }
    }
}

步骤5:编译运行,可以使用模拟器或者真机。

步骤6:按照本文第2部分"域名解析演示"操作即可。

4. 代码分析

在域名解析的时候,使用getAddressesByName函数返回的多个IP地址有可能包括重复的地址,所以在使用的时候要注意去重,本示例是通过如下的方式实现去重的:

javascript 复制代码
 var addrList = ArrayList<String>()
        //遍历解析后得到的每一个网络地址并去重
        for (netaddr in netHandle.getAddressesByName(this.hostName)) {
            if (!addrList.contains(netaddr.address)) {
                addrList.append(netaddr.address)
            }
        }

(本文作者原创,除非明确授权禁止转载)

本文源码地址:
https://gitee.com/zl3624/harmonyos_network_samples/tree/master/code/others/DnsResolve4Cj

本系列源码地址:
https://gitee.com/zl3624/harmonyos_network_samples

相关推荐
cui_win1 小时前
网络分析工具-tcpdump
网络·网络协议·php·tcpdump·疑难杂症
山兔13 小时前
18.2、网络安全评测技术与攻击
网络·安全·web安全
CrazyDragon_King4 小时前
简易屏幕共享工具-基于WebSocket
网络·websocket·网络协议
文火冰糖的硅基工坊5 小时前
[创业之路-230]:《华为闭环战略管理》-5-华为的组织架构与业务架构是不同的,组织架构是为业务架构服务
华为·架构·产品经理·管理·创业·战略
睿思达DBA_WGX7 小时前
Oracle 的网络配置文件详解
网络·数据库·oracle
塞尔维亚大汉7 小时前
【OpenHarmony】 鸿蒙网络请求库之axios
网络协议·harmonyos·arkts
ihengshuai8 小时前
Docker网络与数据卷持久化
网络·docker·容器
前端小芬芬8 小时前
WebSocket 的封装使用
网络·websocket·网络协议
SophieBryant8 小时前
鸿蒙 H5 拉起手机拨号
鸿蒙
如此风景9 小时前
鸿蒙后台任务(Background Tasks Kit)
harmonyos