我們先整體上來看一下AlamoFire這個(gè)框架關(guān)系,概述一些核心模塊。該部分我們先來看一下AlamoFire的文件組織結(jié)構(gòu),然后在給出這些文件組織結(jié)構(gòu)中類的關(guān)系。所以在本部分類圖是少不了的。廢話少說,進(jìn)入該部分的主題。
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),寶豐網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:寶豐等地區(qū)。寶豐做網(wǎng)站價(jià)格咨詢:18982081108首先我們來看一下AlamoFire的目錄結(jié)構(gòu),從整體上來把控一下AlamoFire。下方截圖是AlamoFire框架的所有文件,文件不算多,Alamofire框架的源代碼并不算多,所有理清Alamofire的框架結(jié)構(gòu)還是不難的。下方截圖中是AlamoFire中的所有文件,Core文件夾下是Alamofire的核心文件,F(xiàn)eatures主要是對(duì)核心文件的擴(kuò)展。今天我們就以核心文件為主,F(xiàn)eature文件為輔來窺探一下AlamoFire框架的源碼。
下方是對(duì)Core文件夾下的各個(gè)文件的功能簡述:
Alamofire.swift ---- 該文件中主要是給用戶提供一些便利的調(diào)用方法,用戶可以直接調(diào)用該文件中的便利方法來使用Alamofire相關(guān)功能。
Manager.swift ---- Manager中定義了Session對(duì)象,Session相關(guān)的Delegate,以及Delegate執(zhí)行的隊(duì)列等相關(guān)信息,在Manager中創(chuàng)建Request對(duì)象發(fā)起請(qǐng)求。Manager管理的就是各種請(qǐng)求,Manager對(duì)象是以單例的形式對(duì)外開放的。
Request.swift ---- 該文件如其名,就是負(fù)責(zé)創(chuàng)建Session的各種task的,并執(zhí)行相關(guān)的SessionTask,并調(diào)用相關(guān)書籍解析的功能模塊對(duì)數(shù)據(jù)進(jìn)行解析并通過回調(diào)返回給用戶。
ParameterEncoding.swift ---- 負(fù)責(zé)請(qǐng)求參數(shù)的各種編碼(URL、URLEncodedInURL、JSON、PropertyList等編碼),并將編碼后的數(shù)據(jù)與URLRequest結(jié)合后的結(jié)果進(jìn)行返回。
Result.swift ---- 對(duì)解析后的數(shù)據(jù)封裝成Result對(duì)象。
Response.swift ---- 負(fù)責(zé)將服務(wù)器相應(yīng)的數(shù)據(jù)進(jìn)行封裝生成Response對(duì)象,該對(duì)象中就包括上述的Result對(duì)象,用戶最終會(huì)通過閉包回調(diào)的形式獲取到該Response的對(duì)象。
Notifications.swift ---- 其中是一個(gè)Notification結(jié)構(gòu)體,該結(jié)構(gòu)體中定義了一些字符串,這些字符串就是所需通知的Key,當(dāng)網(wǎng)絡(luò)請(qǐng)求DidResume、DidSuspend、DidCancel、DidComplete都會(huì)發(fā)出通知。
Error.swift ---- 其中是一個(gè)Error的結(jié)構(gòu)體,其中封裝的是各種錯(cuò)誤狀態(tài)。
Features文件夾下各個(gè)文件的功能簡述:
Download.swift ----- 對(duì)Manager和Request類進(jìn)行擴(kuò)展,使其支持Down Task,其中封裝了NSURLSessionDownloadDelegate相關(guān)代理方法。
Upload.swift ---- 在該文件中也是對(duì)Manager和Request類進(jìn)行的擴(kuò)展,使其支持Upload Task,其中封裝了NSURLSessionDataDelegate中獲取上傳數(shù)據(jù)進(jìn)度的代理方法,也就是taskDidSendBodyData代理方法。
MultipartFormData.swift ---- 該文件從名字就可以看出是為了組織多表單數(shù)據(jù)上傳的數(shù)據(jù)的,在Upload Task中就使用到了MultipartFormData。
Stream.swift ---- 和Download和Upload文件相似,該文件中也是對(duì)Manager和Rquest做延展,主要使其支持?jǐn)?shù)據(jù)流的傳輸,其中主要封裝和實(shí)現(xiàn)了NSURLSessionStreamDelegate相關(guān)的代理方法。
ResponseSerialization.swift ---- 該文件中主要是對(duì)Request類進(jìn)行數(shù)據(jù)解析的延展的。其中封裝了各種對(duì)響應(yīng)數(shù)據(jù)的解析方式,其中包括Data、String、JSON、PropertyList等解析方式。
NetworkReachabilityManager.swift ---- 該文件主要是對(duì)SystemConfiguration.framework中的SCNetworkReachability相關(guān)的東西進(jìn)行封裝的,主要用來管理和監(jiān)聽網(wǎng)絡(luò)狀態(tài)的變化。
ServerTrustPolicy.swift ---- 這個(gè)文件主要是對(duì)NSURLSession做的延展,其中定義了各種網(wǎng)絡(luò)請(qǐng)求的認(rèn)證策略,主要證書認(rèn)證相關(guān)東西。
Timeline.swift ---- 該文件是為了方便調(diào)試而生的,其中記錄了相關(guān)操作的時(shí)間點(diǎn),并且對(duì)其進(jìn)行記錄,便于在Debug時(shí)使用到。
Validation.swift ---- 主要是用來驗(yàn)證請(qǐng)求是否成功,如果出錯(cuò)了就做相應(yīng)的處理。
上面是AlamoFire中所有文件的概述,上面這些算是對(duì)AlamoFire框架有大概的了解吧。結(jié)合上方的概述,來研讀AlamoFire源碼還是比較清晰的。下方就是AlamoFire 3.4中相關(guān)文件的木頭結(jié)構(gòu),如下所示:
上面簡單的介紹了Alamofire框架的目錄結(jié)構(gòu)以及每個(gè)文件所負(fù)責(zé)的內(nèi)容。接下來我們進(jìn)入到各個(gè)文件的內(nèi)部,來整體的看一下核心類之間的關(guān)系。下方是核心類的“類圖”,當(dāng)然下方只是核心類的。接下來來概述一下下方的類圖,因?yàn)橄聢D太大,在此看起來不太清楚,如果你感興趣,你可以另存為,然后放大查看。
下方黑框中的部分對(duì)應(yīng)的就是Alamofire.swift中的內(nèi)容。其中主要是一些URL轉(zhuǎn)換字符串的延展以及URLRequst轉(zhuǎn)換成MutableURLRequest的延展,還有一些用戶使用的便利方法。
黃框中就是我們Manager.swift中的內(nèi)容了,Manager類的對(duì)象是以單例的形式對(duì)外展現(xiàn)的,上述黑框中的便利方法,主要是獲取Manager類的單例,然后調(diào)用相應(yīng)的方法。
綠框中所對(duì)應(yīng)的主要是Request.Swift和Features文件夾中的內(nèi)容,主要是Request類及其延展,當(dāng)然還有對(duì)Manager和NSURLSession的延展。
紅框中的就是網(wǎng)絡(luò)請(qǐng)求會(huì)話的各種任務(wù)的回調(diào)方法的封裝了,在這些回調(diào)方法中提供了默認(rèn)實(shí)現(xiàn),并對(duì)外留有回調(diào)塊,以便讓用戶來自己實(shí)現(xiàn)這些回調(diào)方法。
第一部分算是概覽了一下Alamofire框架中的各個(gè)組成部分,接下來該進(jìn)入到上述的各個(gè)模塊中來進(jìn)一步來窺探其實(shí)現(xiàn)和組織方式了。還是“順藤摸瓜”,先從用戶看的到的地方著手,然后層層深入,直到你看不見的地方。所以第二部分我們先來看一下Alamofire.swift中的內(nèi)容,因?yàn)樵撐募茿lamofire框架的入口。
下方的類圖就是第一部分類圖中黑框的放大版,根據(jù)Alamofire.swift這個(gè)文件我們不難畫出下方這個(gè)類圖。有一點(diǎn)要說明的就是在類圖中省略了一些遍歷方法,只寫了一些主要的,不過核心的功能還是有的。下方的URLStringConvertible和URLRequestConvertible是負(fù)責(zé)類型轉(zhuǎn)換的接口,具體的請(qǐng)看下方的介紹。該文件中除了類型轉(zhuǎn)換的方法外就是一些調(diào)用Manager的單例的便利方法了。
下方就是URLStringConvertible協(xié)議以及相關(guān)延展的具體實(shí)現(xiàn),主要功能就是將String、NSURL、NSURLComponents、NSURLRequest中的URL轉(zhuǎn)換成字符串類型。將要轉(zhuǎn)換的類型要遵循URLStringConvertible協(xié)議,并在計(jì)算變量URLString中返回轉(zhuǎn)換后的字符串。具體做法如下所示,這中類型轉(zhuǎn)換方式在開發(fā)中經(jīng)常會(huì)使用到,下方會(huì)給出其他實(shí)例。URLRequestConvertible協(xié)議的功能與URLStringConvertible大同小異,URLRequestConvertible協(xié)議的實(shí)現(xiàn)者負(fù)責(zé)將NSURLRequest轉(zhuǎn)換成NSMutableURLRequest類型。在此就不做過多的贅述了。
下方截圖是Alamofire.swift中的一個(gè)便利方法,其他幾個(gè)便利方法與此相似,都是調(diào)用Manager單例中相應(yīng)的方法,便利方法為了鏈?zhǔn)秸{(diào)用Request類中的相關(guān)方法,所以所有的便利方法都會(huì)返回當(dāng)前Manager單例使用的Request對(duì)象。具體如下所示:
學(xué)以致用,舉一反三。上面那種“面向協(xié)議”開發(fā)的思想值得我們學(xué)習(xí),之前在設(shè)計(jì)模式相關(guān)的系列博客中不止一次的提到過要“面向接口編程”,此處的協(xié)議就是接口。雖然上面只是使用協(xié)議來進(jìn)行簡單的類型轉(zhuǎn)換,這種思想是非常值得我們學(xué)習(xí)的。通過上面類型轉(zhuǎn)換的方式,我們可以寫出下方代碼。下方代碼不是Alamofire框架中的代碼,是我根據(jù)上述的類型轉(zhuǎn)換的實(shí)例所實(shí)現(xiàn)的,下方定義了一個(gè)類型轉(zhuǎn)換的協(xié)議,需要轉(zhuǎn)換的類型要遵循這個(gè)協(xié)議,下方以String為例,具體做法如下所示。
因?yàn)楸憷椒ㄖ饕钦{(diào)用的Manager類的單例,所以接下來我們來看Manager.swift中的東西。Manager類中主要負(fù)責(zé)Session和Request的初始化,并且提供SessionDelegate代理方法的默認(rèn)實(shí)現(xiàn)。在實(shí)現(xiàn)代理方法時(shí)留出了相應(yīng)的閉包已提供給用戶使用該閉包來回調(diào)相應(yīng)的代理方法。在Manager中的SessionDelegate類就是NSURLSessionDelegate以及相關(guān)子協(xié)議的代理類 ,其中就給出了各個(gè)代理方法的默認(rèn)實(shí)現(xiàn),在實(shí)現(xiàn)時(shí)并定義了一系列的Closure回調(diào)變量,當(dāng)這些閉包變量不為空時(shí)就會(huì)執(zhí)行閉包塊中的內(nèi)容,而不會(huì)執(zhí)行提供的默認(rèn)實(shí)現(xiàn)。
下方類圖就是×××部分的放大版,主要是Manager類與SessionDelegate的關(guān)系。從下方類圖中不難看出,SessionDelegate類遵循了NSURLSessionDelegate協(xié)議以及子協(xié)議,并給出了代理相應(yīng)的實(shí)現(xiàn)方法。下方的代碼會(huì)給出代理的具體封裝和實(shí)現(xiàn)方式。
開門見山,因?yàn)镸anager類對(duì)外是以單例的形式對(duì)外使用的,所以我們先來看看Manager類的單例實(shí)現(xiàn)。下方截圖中的sharedInstance計(jì)算屬性就是Manager的單例,其中存儲(chǔ)的就是一個(gè)Manager對(duì)象,在創(chuàng)建Manager對(duì)象時(shí)我們?yōu)镸anager對(duì)象中存儲(chǔ)的NSURLSession對(duì)象指定了一個(gè)defaultSessionConfiguration和一個(gè)defaultHTTPHeaders。
上面是Manager類中單例的實(shí)現(xiàn),接下來我們來解析類中核心的屬性,下方是一些核心屬性的解析:
defaultHTTPHeaders屬性 : defaultHTTPHeaders是Manager類中的一個(gè)計(jì)算屬性,負(fù)責(zé)組織默認(rèn)的請(qǐng)求Header中的內(nèi)容。
session屬性: 該屬性的類型是NSURLSession類型的,負(fù)責(zé)請(qǐng)求會(huì)話,并創(chuàng)建各種會(huì)話任務(wù)。
queue屬性:該屬性是一個(gè)串行隊(duì)列,該隊(duì)列負(fù)責(zé)執(zhí)行session創(chuàng)建Session Task的任務(wù)。
delegate屬性:該屬性是SessionDelegate類型的,而SessionDelegate類遵循了NSURLSessionDelegate及其子協(xié)議,并給出了相應(yīng)的實(shí)現(xiàn),在下方會(huì)著重介紹SessionDelegate。而此處的delegate屬性負(fù)責(zé)調(diào)用SessionDelegate類中相應(yīng)的回調(diào)方法。
在Manager.swift源文件中給出了request方法的實(shí)現(xiàn),Manager類的單例所調(diào)用的upload、download等方法是在其他源文件中做的延展。那些延展中的方法稍后在聊,本部分中就先對(duì)request方法進(jìn)行解析。下方的方法就是我們?cè)诒憷椒ㄖ惺褂肕anager類的單例所調(diào)用的方法。method參數(shù)表示請(qǐng)求方式(GET, POST, PUT等),URLString參數(shù)是請(qǐng)求地址,parameter就是請(qǐng)求參數(shù)了。encoding參數(shù)就是請(qǐng)求參數(shù)的編碼方式,此處默認(rèn)是URL編碼。headers字典參數(shù)就是請(qǐng)求頭信息了,默認(rèn)為nil。下方代碼主要是創(chuàng)建NSMutableURLRequest對(duì)象,然后將參數(shù)進(jìn)行相應(yīng)的編碼后添加進(jìn)NSMutableURLRequest對(duì)象中,然后調(diào)用request()方法發(fā)起請(qǐng)求。
下方代碼段是上述函數(shù)中所調(diào)用的request()方法,下方的request()方法負(fù)責(zé)通過Session創(chuàng)建dataTask,也就是負(fù)責(zé)執(zhí)行Data Task任務(wù)。然后在初始化Request類的對(duì)象時(shí),將創(chuàng)建的Data Task對(duì)象傳給Request對(duì)象。然后將Request對(duì)象的 Task Delegate對(duì)象存入Manager類的delegate屬性中。因?yàn)樵赿elegate屬性中的代理方法是調(diào)用相應(yīng)的Task Delegate的方法,所以在此有必要進(jìn)行存儲(chǔ)。然后調(diào)用Request對(duì)象的resume()方法發(fā)起數(shù)據(jù)的網(wǎng)絡(luò)請(qǐng)求。為了鏈?zhǔn)秸{(diào)用Request對(duì)象的其他方法,所以將Request類的對(duì)象進(jìn)行返回。代碼如下所示:
SessionDelegate可以說是代理的代理,因?yàn)樵赟essionDelegate中有一個(gè)subdelegates字典屬性,該屬性負(fù)責(zé)存儲(chǔ)Request對(duì)象中的各個(gè)Task Delegate。而SessionDelegate在相應(yīng)的代理方法中會(huì)通過存儲(chǔ)的Task Delegate來調(diào)用Task Delegate中的方法,所以SessionDelegate說是代理的代理。
下方代碼段是SessionDelegate類中部分代碼的截圖,其中的subdelegates字典屬性中存儲(chǔ)的就是Request中的TaskDelegate,subdelegateQueue是一個(gè)并行隊(duì)列用來同步執(zhí)行獲取和設(shè)置字典中的Task Delegate對(duì)象。然后就是為SessionDelegate類定義了一個(gè)下標(biāo),該下標(biāo)的功能是以Session Task為下標(biāo)的形式向subdelegates中添加和獲取相應(yīng)的Task Delegate。該自定義下標(biāo)就可以讓類的對(duì)象使用下標(biāo)的形式來設(shè)置和獲取屬性的值,稍后會(huì)給出擴(kuò)展的Demo。
關(guān)于SessionDelegate中所實(shí)現(xiàn)的代理方法,在此我們就一執(zhí)行Data Task請(qǐng)求的didReceiveData代理方法為例。下方截圖就是SessionDelegate中的didReceiveData代理方法。代碼比較簡單,首先判斷該代理方法對(duì)象的Closure回調(diào)變量是否有值,如果有就執(zhí)行該閉包回調(diào)塊,如果沒有值就獲取我們存儲(chǔ)的Data Task Delegate, 然后去執(zhí)行Data Task Delegate中的didReciveData方法。其他方法也于此類似,所以就以點(diǎn)代面,在此就不做過多的贅述了。
接下來有到了舉一反三,擴(kuò)展知識(shí)點(diǎn)的時(shí)刻了。接下來我們單獨(dú)來創(chuàng)建一個(gè)小實(shí)例來看一下Swift中自定義下標(biāo)是怎么回事。大道至簡,接下來我們將上述下標(biāo)的使用進(jìn)行簡化,創(chuàng)建一個(gè)Demo, 然后通過這個(gè)Demo來介紹一下下標(biāo)的使用。
下方代碼段就是我們創(chuàng)建的簡化版的下標(biāo)示例,在Swift的類中是支持自定義下標(biāo)的,自定下標(biāo)可以讓你以下標(biāo)的形式來訪問和設(shè)置屬性。下方就自定義了一個(gè)下標(biāo),在下標(biāo)中設(shè)置和返回value屬性的值。用法如下所示:
逐漸深入,我們現(xiàn)在來到了Request.swift這個(gè)類,因?yàn)樯厦娴腗anager中的請(qǐng)求最終走到了Request類的位置,所以接下來我們要分析的就是Request.swift源文件中的內(nèi)容。Request.swift源文件中主要是執(zhí)行的Data Task請(qǐng)求,并且實(shí)現(xiàn)了相應(yīng)的Data Task Delegate中的方法。其他的任務(wù)例如Download Task, Upload Task,Stream Task等會(huì)在其他文件中對(duì)Request做延展時(shí)執(zhí)行上述這些任務(wù)。我們?cè)诖司鸵訢ata Task為例。Request類中說白了就是負(fù)責(zé)通過會(huì)話創(chuàng)建相應(yīng)的Task,并實(shí)現(xiàn)相應(yīng)Task的代理方法。
下方類圖就是Request相關(guān)類圖了,Request類及其延展中就是創(chuàng)建各種類型的Task,然后給出相應(yīng)的Task Delegate。下方類圖還給出個(gè)各種Task Delegate間的繼承關(guān)系。Request相關(guān)源文件在給出TaskDelegate的代理方法的實(shí)現(xiàn)時(shí),也封裝了閉包狀態(tài)下的回調(diào)方法。這中做法與SessionDelegate中做法一致。下方會(huì)給出具體的介紹。
下方就是Request類的初始化方法,方法需要兩個(gè)參數(shù),第一個(gè)參數(shù)是NSURLSession的對(duì)象,該對(duì)象也就是Manager單例中創(chuàng)建的Session的對(duì)象。而第二個(gè)參數(shù)雖然是Manager傳過來的,但是初始化task的任務(wù)還得交給Request類來做,Manager來只不過是定義了一個(gè)NSURLSessionTask的類型傳到了Request中,例如在Manager的request()方法中task是NSURLSessionDataTask,Manager的upload()方法中的task是NSURLSessionUploadTask類型。
在Request的初始化方法中根據(jù)Manager單例提供的task的類型來確定是創(chuàng)建DataTaskDelegate、UploadTaskDelegate等。在相應(yīng)的Task Delegate中會(huì)創(chuàng)建相應(yīng)的Task。我們還以上述的DataTask為例,如果你調(diào)用Manager單例中的request()方法就會(huì)執(zhí)行下方的DataTaskDelegate()的初始化。如下所示:
上面的delegate是TaskDelegate類型的,因?yàn)閁ploadTaskDelegate、DownloadTaskDelegate以及DataTaskDelegate都是TaskDelegate的子類,所以此處用到了面向?qū)ο蟮摹岸鄳B(tài)性”。下方兩個(gè)屬性就是Request類中的delegate和task屬性,delegate的初始化在上述Requset的初始化方法中,而此處的task是一個(gè)存儲(chǔ)屬性,task的初始化是放在相應(yīng)的TaskDelegate中的,在TaskDelegate中創(chuàng)建完task對(duì)象后再賦值給Request類中的task屬性,如下所示:
在使用Request類的對(duì)象時(shí),我們可以鏈?zhǔn)降恼{(diào)用Request中的方法,最常用的就是獲取相應(yīng)任務(wù)執(zhí)行的進(jìn)度,也就是平時(shí)我使用的progress()方法。下方截圖中的代碼段就是progress()方法的實(shí)現(xiàn)。通過Task Delegate的類型來判斷目前執(zhí)行的哪種任務(wù),然后將傳過來的progress的閉包賦值給相應(yīng)的Task Delegate,在這些Task的Delegate中會(huì)在相應(yīng)的回調(diào)方法中獲取任務(wù)執(zhí)行進(jìn)度,然后執(zhí)行下方傳入的Closure。
下方就是Request類中的resume()方法,其中的代碼比較簡單。主要是用來記錄startTime,然后調(diào)用task的resume方法開始執(zhí)行任務(wù)。當(dāng)然在開始執(zhí)行任務(wù)后要發(fā)起相應(yīng)的通知,此處發(fā)出的是DidResume通知。所有的通知類型都在Notifications.swift文件中的Notifications結(jié)構(gòu)體中存儲(chǔ)著。Request類中的其他方法,比如suspend()、cancel()方法的實(shí)現(xiàn)方式與resume()類似,并且都會(huì)發(fā)出相應(yīng)的通知,在此就不做過多的贅述了。
從第一部分中的類圖中我們能看出與Request類相關(guān)的代理類,TaskDelegate是所有代理類的基類。在該代理類中其實(shí)就是定義了一下必要的屬性和NSURLSessionTaskDelegate中對(duì)應(yīng)的回調(diào)方法,并且為這些回調(diào)方法提供相應(yīng)的閉包回調(diào)的形式。此處就以TaskDelegate代理類為例。下方就是TaskDelegate代理類為NSURLSessionTaskDelegate中相應(yīng)的代理方法提供的Closure方式。其他的代理類如DataTaskDelegate、DownloadTaskDelegate等與此類似。而相應(yīng)的代理方法中就是對(duì)回調(diào)進(jìn)行了處理,不過在處理之前會(huì)判斷相應(yīng)的Closure是否為nil, 如果不為nil的話就執(zhí)行Closure閉包塊中的內(nèi)容。如果為nil,就執(zhí)行提供的默認(rèn)處理。
事無巨細(xì),至此Alamofire中的核心類就已經(jīng)介紹完畢,因?yàn)槠邢?,其他類在此就不做過多贅述了。其他類以及其他文件中的內(nèi)容在第一部分中做了概述,其內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)就不做過多贅述了,在Github上分享的代碼對(duì)這些類的關(guān)鍵技術(shù)細(xì)節(jié)給出了注釋。
在Alamofire框架中大量的使用了延展、閉包以及枚舉關(guān)聯(lián)值。特別是在解析網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)時(shí),將閉包類型作為函數(shù)的參數(shù),然后通過閉包變量來提供相應(yīng)的解析方案,在此就不做過多的贅述了,其他技術(shù)細(xì)節(jié)“仁者見仁,智者見智”。聽我說再多,看再多的技術(shù)博客如果不親自的去了解一下,說再多也是沒用的,實(shí)踐出真知。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。