APP開(kāi)發(fā)必須懂的網(wǎng)絡(luò)常識(shí)
來(lái)源:荊州松滋軟件開(kāi)發(fā)
時(shí)間:2017-05-11
不忘初心,方得始終。最近很多客戶(hù)都在咨詢(xún)APP定制開(kāi)發(fā),但對(duì)于一些基本的網(wǎng)絡(luò)常識(shí)缺少認(rèn)識(shí),其實(shí)APP開(kāi)發(fā)是一件很?chē)?yán)謹(jǐn)?shù)氖虑?,不管是需求分析還是場(chǎng)景演示,對(duì)開(kāi)發(fā)環(huán)境和開(kāi)發(fā)人員的要求都比較高,了解基本的網(wǎng)絡(luò)常識(shí)對(duì)于開(kāi)發(fā)方案的理解會(huì)更深入透徹,有助于產(chǎn)品定位和服務(wù)品質(zhì)的提升,同時(shí),對(duì)網(wǎng)絡(luò)公司有一個(gè)基本的判斷準(zhǔn)則,避免陷入低價(jià)所帶來(lái)的惡性產(chǎn)品循環(huán)和不必要的成本開(kāi)支,也避免后期運(yùn)營(yíng)中出現(xiàn)的初期愿景和現(xiàn)實(shí)產(chǎn)品的分離。湖北國(guó)菱計(jì)算機(jī)科技有限公司軟件開(kāi)發(fā)部工程師給大家總結(jié)了一些APP開(kāi)發(fā)必須懂的網(wǎng)絡(luò)常識(shí)。
1、網(wǎng)絡(luò)常用概念
網(wǎng)絡(luò)是應(yīng)用的靈魂,是所有應(yīng)用的數(shù)據(jù)來(lái)源.離開(kāi)了網(wǎng)絡(luò),我們的應(yīng)用就是一潭死水,網(wǎng)絡(luò)是數(shù)據(jù)交互的媒介,我們通過(guò)網(wǎng)絡(luò)得到服務(wù)器上的數(shù)據(jù),也是通過(guò)網(wǎng)絡(luò)給服務(wù)器傳遞數(shù)據(jù).也就是說(shuō),網(wǎng)絡(luò)的實(shí)質(zhì)就 是是交互數(shù)據(jù),而數(shù)據(jù)交互的媒介就是在網(wǎng)絡(luò)中傳輸二進(jìn)制數(shù)據(jù)流(包括html/圖片/視頻數(shù)據(jù))。
互聯(lián)網(wǎng)開(kāi)發(fā)的常用概念:
客戶(hù)端(Client):移動(dòng)設(shè)備(手機(jī)/iPad等手持設(shè)備),客戶(hù)端一般就是前端/前臺(tái)等等.iOS,android開(kāi)發(fā)都是前端開(kāi)發(fā).
服務(wù)器(Server):為客戶(hù)端提供服務(wù)(比如數(shù)據(jù)/資源等)的機(jī)器---本質(zhì)也是一臺(tái)計(jì)算機(jī)(+服務(wù)器軟件),服務(wù)器開(kāi)發(fā)就是后端/后臺(tái)開(kāi)發(fā).java/php/.net等.
請(qǐng)求(Request):客戶(hù)端向服務(wù)器索取數(shù)據(jù).
響應(yīng)(Response):服務(wù)器對(duì)客戶(hù)端請(qǐng)求做出的反應(yīng),一般就是返回?cái)?shù)據(jù)給客戶(hù)端.
服務(wù)器:按開(kāi)發(fā)階段來(lái)分,分為兩種:
遠(yuǎn)程服務(wù)器: 外網(wǎng)服務(wù)器.應(yīng)用上線之后供全體用戶(hù)使用的服務(wù)器.速度取決于用戶(hù)的網(wǎng)速和服務(wù)器的性能.
本地服務(wù)器: 內(nèi)網(wǎng)服務(wù)器,測(cè)試服務(wù)器.開(kāi)發(fā)測(cè)試階段使用的服務(wù)器.供內(nèi)部開(kāi)發(fā)測(cè)試人員使用.速度飛快.
2.什么是IP地址
靜態(tài)IP地址:固定不變的IP地址,需要用戶(hù)自己手動(dòng)設(shè)置.
動(dòng)態(tài)IP地址:打開(kāi)計(jì)算機(jī)后,自動(dòng)生成的IP地址,不用人為設(shè)置。動(dòng)態(tài)的IP地址是通過(guò)DHCP協(xié)議實(shí)現(xiàn)自動(dòng)獲取的。
子網(wǎng)掩碼:與IP地址配合使用判斷兩臺(tái)計(jì)算機(jī)是否位于同一個(gè)子網(wǎng)絡(luò).
DNS服務(wù)器:可以將域名(網(wǎng)址)轉(zhuǎn)換成IP地址.
DHCP協(xié)議:每一個(gè)子網(wǎng)絡(luò)中,有一臺(tái)計(jì)算機(jī)負(fù)責(zé)管理本網(wǎng)絡(luò)的所有IP地址,它叫做“DHCP服務(wù)器”.當(dāng)新的計(jì)算機(jī)加入網(wǎng)絡(luò),必須向“DHCP服務(wù)器”發(fā)
送一個(gè)“DHCP請(qǐng)求”數(shù)據(jù)包,申請(qǐng)IP地址和相關(guān)的網(wǎng)絡(luò)參數(shù).然后DHCP協(xié)議會(huì)賦予本機(jī)一些參數(shù),如動(dòng)態(tài)IP地址,子網(wǎng)掩碼,網(wǎng)關(guān),DNS服務(wù)器等.
以太網(wǎng)標(biāo)頭:設(shè)置發(fā)出方(本機(jī))的MAC地址和接收方(DHCP服務(wù)器)的MAC地址.
IP標(biāo)頭:設(shè)置發(fā)出方(本機(jī))的IP地址和接收方(DHCP服務(wù)器)的IP地址
UDP標(biāo)頭:設(shè)置發(fā)出方(本機(jī))的端口和接收方(DHCP服務(wù)器)的端口. 這一部分是DHCP協(xié)議規(guī)定好的,發(fā)出方是68端口,接收方是67端口.
所以電腦想要上網(wǎng),都需要確定這四個(gè)參數(shù):本機(jī)IP地址, 子網(wǎng)掩碼, 網(wǎng)關(guān)的IP地址, DNS的IP地址。
3.HTTP請(qǐng)求
通俗地說(shuō),網(wǎng)絡(luò)協(xié)議就是網(wǎng)絡(luò)之間溝通、交流的橋梁,只有相同網(wǎng)絡(luò)協(xié)議的計(jì)算機(jī)才能進(jìn)行信息的溝通與交流。這就好比人與人之間交流所使用的各種語(yǔ)言一樣,只有使用相同語(yǔ)言才能正常、順利地進(jìn)行交流。從專(zhuān)業(yè)角度定義,網(wǎng)絡(luò)協(xié)議是計(jì)算機(jī)在網(wǎng)絡(luò)中實(shí)現(xiàn)通信時(shí)必須遵守的約定,也就是通信協(xié)議。主要是對(duì)信息傳輸?shù)乃俾?、傳輸代碼、代碼結(jié)構(gòu)、傳輸控制步驟、出錯(cuò)控制等作出規(guī)定并制定出標(biāo)準(zhǔn)。
3.1. URL(Uniform Resource Locator):
統(tǒng)一資源定位符.URL就是資源的地址,位置.通過(guò)一個(gè)URL能夠找到互聯(lián)網(wǎng)上唯一的一個(gè)資源.
URL的基本格式: 協(xié)議://主機(jī)地址/路徑
協(xié)議:不同的協(xié)議代表不同的資源查找方式,資源傳輸方式.
URL中的常見(jiàn)協(xié)議:
<1>HTTP:超文本傳輸協(xié)議,在網(wǎng)絡(luò)開(kāi)發(fā)中最常用的協(xié)議.訪問(wèn)的是遠(yuǎn)程的網(wǎng)絡(luò)資源.格式:http://...
<2>IP協(xié)議:
TCP數(shù)據(jù)包嵌入IP數(shù)據(jù)包.IP數(shù)據(jù)包標(biāo)頭需要設(shè)置雙方的IP地址.發(fā)送方(本機(jī))是:192.168.2.6 ,接收方(百度)是:119.75.218.70
IP數(shù)據(jù)包的標(biāo)頭長(zhǎng)度為20字節(jié).加上嵌入的TCP數(shù)據(jù)包,現(xiàn)在總長(zhǎng)度是5000字節(jié)
<3>file:訪問(wèn)的時(shí)本地計(jì)算機(jī)上的資源.格式:file://(不要再加主機(jī)地址了)
<4>FTP:訪問(wèn)的是共享主機(jī)的文件資源.格式:ftp://
<5>TCP協(xié)議:
TCP數(shù)據(jù)包標(biāo)頭需要設(shè)置端口,接收方(Baidu)的HTTP端口默認(rèn)是80,發(fā)送方(本機(jī))的端口是一個(gè)隨機(jī)生成的1024~65535之間的整數(shù).
TCP數(shù)據(jù)包的標(biāo)頭長(zhǎng)度是20字節(jié).加上嵌入的HTTP數(shù)據(jù)包,現(xiàn)在總長(zhǎng)度是4980字節(jié).
<6>以太網(wǎng)協(xié)議
IP數(shù)據(jù)包嵌入以太網(wǎng)數(shù)據(jù)包的數(shù)據(jù)部分.以太網(wǎng)數(shù)據(jù)包的標(biāo)頭需要設(shè)置雙方的MAC地址.發(fā)送方為本機(jī)的網(wǎng)卡MAC地址,接收方為網(wǎng)關(guān)192.168.2.1的MAC地址(通過(guò)ARP協(xié)議得到), 以太網(wǎng)數(shù)據(jù)包的數(shù)據(jù)部分,最大長(zhǎng)度為1500字節(jié),而現(xiàn)在的IP數(shù)據(jù)包長(zhǎng)度為5000字節(jié).因此,IP數(shù)據(jù)包必須分割成四個(gè)包,因?yàn)槊總€(gè)包都有自己的IP標(biāo)頭(20字節(jié)),所以四個(gè)包的IP數(shù)據(jù)包的長(zhǎng)度分別為1500 ,1500, 1500,560 字節(jié).
<7>mailto:訪問(wèn)的是電子郵件地址.格式:mailto:
主機(jī)地址:存放資源的主機(jī)IP地址(域名).
路徑:資源在主機(jī)中得具體位置.
3.2. HTTP請(qǐng)求的完整過(guò)程:
<1> 請(qǐng)求: 客戶(hù)端發(fā)出請(qǐng)求.向服務(wù)器索要數(shù)據(jù)(操作數(shù)據(jù)).
<2> 響應(yīng): 服務(wù)器對(duì)客戶(hù)端的請(qǐng)求做出響應(yīng).返回客戶(hù)端所需要的數(shù)據(jù).
3.3. 包裝一個(gè)HTTP請(qǐng)求
用 NSURLRequest 來(lái)包裝一個(gè)HTTP請(qǐng)求.可以指定緩存策略和超時(shí)時(shí)間,緩存策略的選擇:NSURLRequestCachePolicy
NSURLRequestUseProtocolCachePolicy = 0, // 默認(rèn)的緩存策略,使用協(xié)議定義. NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地緩存,直接從原始服務(wù)器地址下載. NSURLRequestReturnCacheDataElseLoad = 2, // 只有在緩存中不存在數(shù)據(jù)時(shí),才從原始地址下載 NSURLRequestReturnCacheDataDontLoad = 3, // 只使用緩存數(shù)據(jù),如果不存在緩存,則請(qǐng)求失敗. 用于沒(méi)有網(wǎng)絡(luò)連接的離線模式 NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // 忽略遠(yuǎn)程和本地的數(shù)據(jù)緩存,直接從原始地址下載 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略緩存,直接從原始服務(wù)器地址下載. NSURLRequestReloadRevalidatingCacheData = 5, // 驗(yàn)證本地?cái)?shù)據(jù)和遠(yuǎn)程數(shù)據(jù)是否相同,如果不同則下載遠(yuǎn)程數(shù)據(jù),否則使用本地?cái)?shù)據(jù)
網(wǎng)絡(luò)緩存數(shù)據(jù),保存在SQLite的數(shù)據(jù)庫(kù)中(NSHomeDirectory),
網(wǎng)絡(luò)緩存數(shù)據(jù),保存在SQLite的數(shù)據(jù)庫(kù)中(NSHomeDirectory)
3.4. 發(fā)送請(qǐng)求
用 NSURLConnection 發(fā)送請(qǐng)求.
同步方法:
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
異步方法:
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler
4.Socket介紹
網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過(guò)程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng),客戶(hù)端請(qǐng)求,連接確認(rèn)。
(1)服務(wù)器監(jiān)聽(tīng):是服務(wù)器端套接字并不定位具體的客戶(hù)端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。
(2)客戶(hù)端請(qǐng)求:是指由客戶(hù)端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶(hù)端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。
(3)連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶(hù)端套接字的連接請(qǐng)求,它就響應(yīng)客戶(hù)端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶(hù)端,一旦客戶(hù)端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng),繼續(xù)接收其他客戶(hù)端套接字的連接請(qǐng)求。
分步驟創(chuàng)建Socket
1.創(chuàng)建客戶(hù)端Socket socket(<#int#>, <#int#>, <#int#>);
2.創(chuàng)建服務(wù)器Socket struct sockaddr_in serverAddress;
3.連接到服務(wù)器(Socket編程) connect(<#int#>, <#const struct sockaddr *#>, <#socklen_t#>);
4.發(fā)送數(shù)據(jù)給服務(wù)器 send(<#int#>, <#const void *#>, <#size_t#>, <#int#>)
5.接收服務(wù)器返回的數(shù)據(jù) recv(<#int#>, <#void *#>, <#size_t#>, <#int#>)
6.關(guān)閉 Socket close(socketNumber)
湖北國(guó)菱計(jì)算機(jī)科技有限公司軟件開(kāi)發(fā)部面向荊州松滋乃止全國(guó)客戶(hù),提供軟件開(kāi)發(fā)、APP開(kāi)發(fā)、網(wǎng)站建設(shè)和網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)等服務(wù)。我們所關(guān)注的一些業(yè)界包括電子商務(wù)、電子政務(wù)、辦公室自動(dòng)化、金融服務(wù)、公共衛(wèi)生、物聯(lián)網(wǎng)和多媒體等。我們的服務(wù)可以為客戶(hù)提供一個(gè)專(zhuān)門(mén)的開(kāi)發(fā)團(tuán)隊(duì)或承接您公司內(nèi)部的項(xiàng)目,擅長(zhǎng)為客戶(hù)定制應(yīng)用程序開(kāi)發(fā),請(qǐng)點(diǎn)擊瀏覽我們的成功案例。歡迎來(lái)電洽談合作:0716-6666211.