当前位置: 首页 > article >正文

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

1. 域名解析简介

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

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

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

import ohos.net.connection.*

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

//获取默认激活的数据网络。
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配置文件加上对权限的声明:

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "ohos.permission.GET_NETWORK_INFO"
      }
    ]

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

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

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

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

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地址有可能包括重复的地址,所以在使用的时候要注意去重,本示例是通过如下的方式实现去重的:

 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


http://www.kler.cn/a/374446.html

相关文章:

  • 追风赶月莫停留,平芜尽处是春山—记一次备考经历(下)
  • Python|Pyppeteer实现自动化获取reCaptcha验证码图片以及提示词(29)
  • 多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
  • 微调大模型时,如何进行数据预处理? 将<input, output>转换为模型所需的<input_ids, labels, attention_mask>
  • 系统压力测试助手——stress-ng
  • webrtc获取IceCandidate流程
  • 【计算机科学】快速幂:指数运算的分治之美
  • 深度学习:Softmax 函数详解
  • C++基于opencv的视频质量检测--遮挡检测
  • pytest高版本兼容test_data[“log“] = _handle_ansi(“\n“.join(logs))错误
  • 安装Docker环境的两种方式
  • 反序列化漏洞的运行原理及防御方法
  • Halcon-模板匹配(WPF)
  • 【Linux系统编程】第四十弹---深入理解操作系统:信号捕捉、可重入函数、volatile关键字与SIGCHLD信号解析
  • 从Flux Dev蒸馏出来的模型——Flux.1 Lite
  • rom定制系列------红米note8_miui14安卓13定制修改固件 带面具root权限 刷写以及界面预览
  • 灵动AI视频 —— 创意无界,视频新生
  • Qt限制QGraphicsScene QGraphicsItem内部的移动范围
  • mac 使用命令卸载Node.js
  • Qt指定程序编译生成文件的位置
  • 使用 pkg 打包 Puppeteer 应用:跨平台自动化的轻量级选择
  • 管家婆财贸ERP BB072.销售单草稿明细生成组装拆分单
  • [实战-11] FlinkSql设置时区(table.local-time-zone)
  • MySQL 的 select * 会用到事务吗?
  • Ethernet 系列(6)-- 基础学习::OSI Model
  • 金融小白两周完成一个量化系统 (二)项目进度以及数据获取