鴻蒙網(wǎng)絡(luò)編程系列42-倉(cāng)頡版域名解析示例

1. 域名解析簡(jiǎn)介

域名解析是網(wǎng)絡(luò)開(kāi)發(fā)中經(jīng)常使用的功能之一航棱,特別是對(duì)于當(dāng)前版本的鴻蒙API,使用TCP或者UDP等網(wǎng)絡(luò)協(xié)議通訊時(shí)靠胜,只能使用確定的IP地址進(jìn)行綁定或者發(fā)送消息掉瞳,還不支持直接使用域名毕源,所以,通過(guò)域名解析得到對(duì)應(yīng)的IP地址陕习,然后再使用套接字進(jìn)行通訊霎褐,可以避免使用者記錄IP地址的困難。

在本系列的第15篇文章《鴻蒙網(wǎng)絡(luò)編程系列15-域名解析示例》中该镣,我們基于ArkTS語(yǔ)言在API 9的環(huán)境下演示了對(duì)網(wǎng)站域名進(jìn)行解析的過(guò)程冻璃,本文將使用倉(cāng)頡語(yǔ)言在API 12的環(huán)境中實(shí)現(xiàn)類似的功能。

鴻蒙封裝的網(wǎng)絡(luò)管理包损合,使用如下的方式導(dǎo)入:

import ohos.net.connection.*

connection包和域名解析相關(guān)的函數(shù)主要是如下三個(gè):

//獲取默認(rèn)激活的數(shù)據(jù)網(wǎng)絡(luò)省艳。
1. public func getDefaultNet(): NetHandle

//NetHandle類的函數(shù),使用對(duì)應(yīng)網(wǎng)絡(luò)解析主機(jī)名以獲取所有IP地址嫁审。
2. public func getAddressesByName(host: String): Array<NetAddress>

//NetHandle類的函數(shù)跋炕,使用對(duì)應(yīng)網(wǎng)絡(luò)解析主機(jī)名以獲取第一個(gè)IP地址。
3. public func getAddressByName(host: String): NetAddress

一個(gè)域名可能對(duì)應(yīng)多個(gè)IP地址律适,如果只是獲取域名對(duì)應(yīng)的IP地址辐烂,可以使用getAddressByName函數(shù),如果需要獲取域名對(duì)應(yīng)的所有IP地址捂贿,需要使用getAddressesByName函數(shù)纠修,本文要演示解析域名的所有IP地址,所以使用的是getAddressByName厂僧。

2. 域名解析演示

本示例運(yùn)行后的界面如圖所示:

image.png

輸入待解析的域名扣草,然后單擊“解析”按鈕,即可進(jìn)行解析颜屠,這里使用了百度和華為開(kāi)發(fā)者社區(qū)的域名德召,解析結(jié)果如圖所示:

image.png

可以看到,解析出了所有對(duì)應(yīng)的IP地址汽纤。

3. 域名解析示例編寫

下面詳細(xì)介紹創(chuàng)建該示例的步驟(確保DevEco Studio已安裝倉(cāng)頡插件)。

步驟1:創(chuàng)建[Cangjie]Empty Ability項(xiàng)目福荸。

步驟2:在module.json5配置文件加上對(duì)權(quán)限的聲明:

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

這里添加了獲取網(wǎng)絡(luò)信息和訪問(wèn)互聯(lián)網(wǎng)的權(quán)限蕴坪。

步驟3:在build-profile.json5配置文件加上倉(cāng)頡編譯架構(gòu):

"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 {
    //標(biāo)題
    @State
    var title: String = "倉(cāng)頡版域名解析示例"
    //連接、通訊歷史記錄
    @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)
    }

    //解析域名對(duì)應(yīng)的IP地址
    func resolveHost() {
        //獲取默認(rèn)的激活網(wǎng)絡(luò)
        let netHandle = getDefaultNet();

        var addrList = ArrayList<String>()
        //遍歷解析后得到的每一個(gè)網(wǎng)絡(luò)地址并去重
        for (netaddr in netHandle.getAddressesByName(this.hostName)) {
            if (!addrList.contains(netaddr.address)) {
                addrList.append(netaddr.address)
            }
        }
        this.msgHistory += "解析域名[${this.hostName}]的結(jié)果:\r\n"
        //輸出去重后的IP地址
        for (addr in addrList) {
            this.msgHistory += "${addr}\r\n"
        }
    }
}

步驟5:編譯運(yùn)行敬锐,可以使用模擬器或者真機(jī)背传。

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

4. 代碼分析

在域名解析的時(shí)候台夺,使用getAddressesByName函數(shù)返回的多個(gè)IP地址有可能包括重復(fù)的地址径玖,所以在使用的時(shí)候要注意去重,本示例是通過(guò)如下的方式實(shí)現(xiàn)去重的:

 var addrList = ArrayList<String>()
        //遍歷解析后得到的每一個(gè)網(wǎng)絡(luò)地址并去重
        for (netaddr in netHandle.getAddressesByName(this.hostName)) {
            if (!addrList.contains(netaddr.address)) {
                addrList.append(netaddr.address)
            }
        }

(本文作者原創(chuàng)颤介,除非明確授權(quán)禁止轉(zhuǎn)載)

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梳星,一起剝皮案震驚了整個(gè)濱河市赞赖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冤灾,老刑警劉巖前域,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異韵吨,居然都是意外死亡匿垄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門归粉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椿疗,“玉大人,你說(shuō)我怎么就攤上這事糠悼〗扉” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵绢掰,是天一觀的道長(zhǎng)痒蓬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)滴劲,這世上最難降的妖魔是什么攻晒? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮班挖,結(jié)果婚禮上鲁捏,老公的妹妹穿的比我還像新娘。我一直安慰自己萧芙,他們只是感情好给梅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著双揪,像睡著了一般动羽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渔期,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天运吓,我揣著相機(jī)與錄音,去河邊找鬼疯趟。 笑死拘哨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的信峻。 我是一名探鬼主播倦青,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盹舞!你這毒婦竟也來(lái)了产镐?” 一聲冷哼從身側(cè)響起隘庄,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磷账,沒(méi)想到半個(gè)月后峭沦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃糟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年吼鱼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绰咽。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菇肃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出取募,到底是詐尸還是另有隱情琐谤,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布玩敏,位于F島的核電站斗忌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旺聚。R本人自食惡果不足惜织阳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砰粹。 院中可真熱鬧唧躲,春花似錦、人聲如沸碱璃。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嵌器。三九已至肛真,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爽航,已是汗流浹背毁欣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岳掐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓饭耳,卻偏偏與公主長(zhǎng)得像串述,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寞肖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容