一、網(wǎng)絡(luò)的基本知識(shí)
1、網(wǎng)絡(luò)層次的劃分 (1)、物理層 負(fù)責(zé)將比特流在結(jié)點(diǎn)間傳輸,即負(fù)責(zé)物理傳輸。 該層的協(xié)議既與鏈路有關(guān)也與傳輸介質(zhì)有關(guān)。 在物理層上所傳數(shù)據(jù)的單位是比特。 物理層的任務(wù)就是透明地傳送比特流 (2)、數(shù)據(jù)鏈路層 負(fù)責(zé)將ip數(shù)據(jù)報(bào)封裝成合適在物理網(wǎng)絡(luò)上傳輸?shù)膸袷讲鬏敚驅(qū)奈锢怼⒕W(wǎng)絡(luò)接收到的幀解封,去除IP數(shù)據(jù)報(bào)交給網(wǎng)絡(luò)層。在兩個(gè)相鄰結(jié)點(diǎn)之間傳送數(shù)據(jù)時(shí),數(shù)據(jù)鏈路層將網(wǎng)絡(luò)層交下來(lái)的IP數(shù)據(jù)報(bào)組裝成幀(framing),在兩個(gè)相鄰結(jié)點(diǎn)間的鏈路上“透明”地傳送幀(frame)中的數(shù)據(jù)。每一幀包括數(shù)據(jù)和必要的控制信息(如同步信息、地址信息、差錯(cuò)控制等)。 (3)、網(wǎng)絡(luò)層 負(fù)責(zé)將數(shù)據(jù)報(bào)文獨(dú)立地m從信源發(fā)送到信宿,主要解決路由選擇、擁塞控制和網(wǎng)絡(luò)互聯(lián)等問(wèn)題。網(wǎng)絡(luò)層負(fù)責(zé)為分組交換網(wǎng)上的不同主機(jī)提供通信服務(wù)。在發(fā)送數(shù)據(jù)時(shí),網(wǎng)絡(luò)層把運(yùn)輸層產(chǎn)生的報(bào)文段或用戶數(shù)據(jù)報(bào)封裝成分組或包進(jìn)行傳送。在TCP/IP體系結(jié)構(gòu)中,由于網(wǎng)絡(luò)層使用IP協(xié)議,因此分組也叫作IP數(shù)據(jù)報(bào),或簡(jiǎn)稱為數(shù)據(jù)報(bào)。 (4)、傳輸層 負(fù)責(zé)為信源和信宿提供應(yīng)用程序進(jìn)程間的數(shù)據(jù)傳輸服務(wù),這一層上主要定義了兩個(gè)傳輸協(xié)議,傳輸控制協(xié)議TCP和用戶數(shù)據(jù)報(bào)協(xié)議UDP。運(yùn)輸層的任務(wù)就是負(fù)責(zé)向兩個(gè)主機(jī)中進(jìn)程之間的通信提供服務(wù)。由于一個(gè)主機(jī)可同時(shí)運(yùn)行多個(gè)進(jìn)程,因此運(yùn)輸層有復(fù)用和分用的功能。復(fù)用就是多個(gè)應(yīng)用層進(jìn)程可同時(shí)使用下面運(yùn)輸層的服務(wù),分用則是運(yùn)輸層把收到的信息分別交付給上面應(yīng)用層中的相應(yīng)的進(jìn)程。 (5)、應(yīng)用層 應(yīng)用層是體系結(jié)構(gòu)中的最高層。應(yīng)用層直接為用戶的應(yīng)用進(jìn)程提供服務(wù)。這里的進(jìn)程就是指正在運(yùn)行的程序。支持網(wǎng)絡(luò)應(yīng)用,應(yīng)用協(xié)議僅僅是網(wǎng)絡(luò)應(yīng)用的一個(gè)組成部分,運(yùn)行在不同主機(jī)上的進(jìn)程則使用應(yīng)用層協(xié)議進(jìn)行通信。通信的協(xié)議主要有:http,ftp等。 2、Http協(xié)議 Http協(xié)議(超文本傳輸協(xié)議),是用www服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。它不僅保證計(jì)算機(jī)正確快速地傳輸超文本文檔,還能確定傳輸文檔中的哪一部分,及哪部分內(nèi)容首先顯示。 Http協(xié)議是一個(gè)應(yīng)用層協(xié)議,由請(qǐng)求和響應(yīng)構(gòu)成,是一個(gè)標(biāo)準(zhǔn)的客戶端服務(wù)器模型。Http是無(wú)狀態(tài)的協(xié)議。 Http協(xié)議的主要特點(diǎn): (1)支持客戶端/服務(wù)器模式 (2)簡(jiǎn)單快速。客戶端請(qǐng)求服務(wù)器是,只需要傳遞請(qǐng)求方法和路徑。 (3)靈活,Http準(zhǔn)許傳輸任意類型的數(shù)據(jù)對(duì)象。 (4)無(wú)連接:每次連接只處理一個(gè)請(qǐng)求,服務(wù)器處理客戶端的請(qǐng)求,并收到客戶端的應(yīng)答后,就會(huì)斷開(kāi)連接。 (5)無(wú)狀態(tài):Http協(xié)議是無(wú)狀態(tài)的,無(wú)狀態(tài)是指協(xié)議對(duì)于事物處理沒(méi)有記憶功能,缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,會(huì)導(dǎo)致連接接送的數(shù)據(jù)量增大,但是會(huì)減輕服務(wù)器的壓力。 Http與Https的區(qū)別: 總的來(lái)說(shuō)Http效率更高Https安全性更高。首先談?wù)勈裁词荋ttps(安全超文本傳輸協(xié)議)它是一個(gè)安全通信通道,它基于Http開(kāi)發(fā),用于在客戶計(jì)算機(jī)和服務(wù)器之間交換信息。它使用安全套接字層(SSL)進(jìn)行信息交換,簡(jiǎn)單來(lái)說(shuō)它是Http的安全版。它是由Netscape開(kāi)發(fā)并內(nèi)置于其瀏覽器中,用于對(duì)數(shù)據(jù)進(jìn)行壓縮和解壓操作并返回網(wǎng)絡(luò)上傳送回的結(jié)果。Https實(shí)際上應(yīng)用了Netscape的安全套接字層(SSL)作為Http應(yīng)用層的子層。兩者用的端口號(hào)也不同Http采用80端口,而Https采用443端口。 Http的兩種數(shù)據(jù)請(qǐng)求方式:get和post (1)get把參數(shù)數(shù)據(jù)隊(duì)列追加到URL中,值和字段相對(duì)應(yīng),在URL中可以看到。post是通過(guò)將表單內(nèi)的字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳輸?shù)紸CTION屬性所指定的URL中,用戶看不到。 (2)get傳輸?shù)臄?shù)據(jù)較小,不能大于2kb。post傳輸?shù)臄?shù)據(jù)量較大。 (3)get安全性較低,執(zhí)行效率高;post安全性高,但是執(zhí)行效率低。包含機(jī)密信息,建議采用post方式。做數(shù)據(jù)查詢,建議用get方式。做數(shù)據(jù)添加或者修改,建議采用post形式。 返回狀態(tài)碼: 1xx 表示通知信息的,如請(qǐng)求收到了或正在進(jìn)行處理 2xx 表示成功,如接受或知道了。 3xx 表示重定向,表示要完成請(qǐng)求還必須采取進(jìn)一步的行動(dòng)。 4xx 表示客戶的差錯(cuò),如請(qǐng)求中有錯(cuò)誤的語(yǔ)法或不能完成。 5xx 表示服務(wù)器的差錯(cuò),如服務(wù)器失效無(wú)法完成請(qǐng)求。 3、統(tǒng)一資源定位符 URL 統(tǒng)一資源定位符 URL 是對(duì)可以從因特網(wǎng)上得到的資源的位置和訪問(wèn)方法的一種簡(jiǎn)潔的表示。 URL 給資源的位置提供一種抽象的識(shí)別方法,并用這種方法給資源定位。 只要能夠?qū)Y源定位,系統(tǒng)就可以對(duì)資源進(jìn)行各種操作,如存取、更新、替換和查找其屬性。 URL 的一般形式 : 由以冒號(hào)隔開(kāi)的兩大部分組成,并且在 URL 中的字符對(duì)大寫(xiě)或小寫(xiě)沒(méi)有要求。 <協(xié)議>://<主機(jī)>:<端口>/<路徑> 其中,協(xié)議:http —— 超文本傳送協(xié)議 HTTP ftp —— 文件傳送協(xié)議 FTP 主機(jī):是存放資源的主機(jī)在因特網(wǎng)中的域名或IP地址 使用 HTTP 的 URL 的一般形式: http://<主機(jī)>:<端口>/<路徑> 其中,http:是http協(xié)議。 :// :冒號(hào)和兩個(gè)斜線是規(guī)定的格式 <主機(jī)> 主機(jī)的域名或者ip地址 <端口> HTTP 的默認(rèn)端口號(hào)是 80,通常可省略 <路徑> 若省略文件的<路徑>項(xiàng),則 URL 就指到因特網(wǎng)上的某個(gè)主頁(yè)(home page)。 4、CURL的簡(jiǎn)單應(yīng)用(CURL用C開(kāi)發(fā)的) curl庫(kù)是一款免費(fèi)開(kāi)源的支持多種協(xié)議以及多個(gè)平臺(tái)的通信開(kāi)發(fā)包,它非常適合在cocos2dx中使用,HttpClient的底層就是使用的curl。 curl工作的一般流程: (1)、curl_easy_init //獲取curl工具 (2)、curl_easy_setopt //設(shè)置一些選項(xiàng) (3)、curl_easy_perform //真正開(kāi)始請(qǐng)求 (4)、curl_easy_cleanup //清理二、curl代碼示例
頭文件的導(dǎo)入: 首先,在Xcode中,添加一條頭文件搜索路徑: /Users/mac/Desktop/Cocos_work/AngryBirds/cocos2d/external/curl/include/ios 其中AngryBirds:是工程名;然后導(dǎo)入頭文件: #include "curl/curl.h" #include "json/rapidjson.h" #include "json/document.h" #include "json/writer.h" #include "json/stringbuffer.h" using namespace rapidjson; 1、curl get方式獲取數(shù)據(jù): CURL *curl; CURLcode res; struct MemoryStruct chunk; chunk.memory = (char*)malloc(1); chunk.size = 0; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl,CURLOPT_URL,"http://192.168.0.101:8088/ztedu/?action=ztedu.register&name=czj&pwd=1111"); curl_easy_setopt(curl,CURLOPT_WRITEDATA,(void*)&chunk); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,WritrMemoryCallback); res = curl_easy_perform(curl);//啟動(dòng)請(qǐng)求,開(kāi)始執(zhí)行 curl_easy_cleanup(curl); if (!res) { log("%s/n",chunk.memory);//將獲取的內(nèi)容輸出,可以看出輸出的內(nèi)容是json格式。 } else { log("error!/n"); } } //接下來(lái)可以對(duì)json進(jìn)行解析 string path = FileUtils::getInstance()->getWritablePath(); //拼接路徑 到path(可讀可寫(xiě))路徑之下 string jsonPath = path + string("charpter3.json"); if (!FileUtils::getInstance()->isFileExist(jsonPath))//此時(shí)在path(可讀可寫(xiě))路徑之下還沒(méi)有charpter.json文件 { string fileContents = chunk.memory; FILE* file = fopen(jsonPath.c_str(), "w"); if (file) { fputs(fileContents.c_str(), file); fclose(file); } } Document doc; string data = FileUtils::getInstance()->getStringFromFile(jsonPath); doc.Parse<kParseDefaultFlags>(data.c_str()); if (doc.HasparseError()) { log("error/r/n"); return ; } rapidjson::Value &status = doc["status"]; rapidjson::Value &message = doc["message"]; log("文件::status:%d message:%s /n",status.GetInt(),message.GetString()); 2、curl post方式獲取數(shù)據(jù): CURL *curl; CURLcode res; struct MemoryStruct chunk; chunk.memory = (char*)malloc(1); chunk.size = 0; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl,CURLOPT_URL,"http://192.168.0.101:8088/ztedu/?action=ztedu.login"); curl_easy_setopt(curl,CURLOPT_POSTFIELDS,"&name=zzw&pwd=1993");curl_easy_setopt(curl,CURLOPT_WRITEDATA,(void*)&chunk); res = curl_easy_perform(curl); curl_easy_cleanup(curl); if (!res) { log("%s/n",chunk.memory); } else { log("error!/n"); } } 3、回調(diào)函數(shù) struct MemoryStruct{ char* memory; size_t size;};static size_t WritrMemoryCallback(void *contents,size_t size,size_t nmemb,void *userp){ //nmemb::個(gè)數(shù) //realloc:重新開(kāi)辟空間 //realsize:長(zhǎng)度 size_t realsize = size *nmemb; struct MemoryStruct *mem = (struct MemoryStruct*)userp; mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1); if (mem->memory == NULL) { 三、HttpClient代碼示例 頭文件的導(dǎo)入:#include "json/rapidjson.h"#include "json/document.h"#include "json/writer.h"#include "json/stringbuffer.h"using namespace rapidjson;#include "network/HttpRequest.h"#include "network/HttpResponse.h"#include "network/HttpCookie.h"using namespace cocos2d::network; 1、get方式獲取數(shù)據(jù):HttpRequest* request = new(nothrow)HttpRequest();request->setUrl("http://192.168.0.117:8088/ztedu/?action=ztedu.login&name=lxb&pwd=1994");request->setRequestType(HttpRequest::Type::GET);request->setResponseCallback(CC_CALLBACK_2(HttpWork::onHttpRequestCompleted, this));request->setTag("GET test");HttpClient::getInstance()->send(request);request->release(); 2、post方式獲取數(shù)據(jù): HttpRequest* request = new(nothrow)HttpRequest(); request->setUrl("http://192.168.0.117:8088/ztedu/?action=ztedu.register"); request->setRequestType(HttpRequest::Type::POST); request->setResponseCallback(CC_CALLBACK_2(HttpWork::onHttpRequestCompleted, this)); //write the post data const char* postData = "&name=zzw&pwd=1993"; request->setRequestData(postData, strlen(postData)); request->setTag("GET test"); HttpClient::getInstance()->send(request); request->release(); 3、回調(diào)函數(shù):void NetWork::onHttpRequestCompleted(HttpClient *sender,HttpResponse *response){ if (!response) { return; } vector<char>*buffer = response->getResponseData(); char* str = (char*)realloc(str, buffer->size() + 1); for (unsigned int i = 0; i<buffer->size(); i++) { str[i] = (*buffer)[i]; } str[buffer->size()] = '/0'; //這樣獲取來(lái)的數(shù)據(jù)存在str中,格式也為json格式。接下來(lái)就可以按照上面的方法對(duì)json進(jìn)行解析了。 Document doc; doc.Parse<kParseDefaultFlags>(str); if (doc.HasParseError()) { log("error/r/n"); return ; } 、、、、、、、}新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注