(轉http://blog.csdn.net/sinat_28338727/article/details/52804167)
網絡結構
網絡結構是網絡的構建方式,目前流行的有客戶端服務器結構網絡和點對點結構網絡。
客戶端服務器結構網絡
客戶端服務器結構網絡是一種主從結構網絡。服務器一般處於等待狀態,如果有客戶端請求,服務器響應請求,建立連接,提供服務。服務器是被動的,客戶端是主動的。
點對點結構網絡
點對點結構網絡也叫對等結構網絡,每個節點之間是對等的。
考慮到跨平台的需要,Cocos2d-JS引擎主要采用C/S結構網絡。
客戶端服務器應用層最主要采用的是HTTP和HTTPS等傳輸協議。因此有必要介紹一下HTTP和HTTPS:
HTTP
HTTP是超文本傳輸協議,Internet的基本協議是TCP/IP,目前廣泛采用的是HTTP、HTTPS、FTP、Archie Gopher等是建立在TCP/IP之上的應用層協議,不同的協議對應着不同的應用。
HTTP是一個屬於應用層的面向對象的協議。由於其簡潔,快速的方式。適用於分布式超文本信息傳輸。
HTTP協議共定義了8種請求方法,OPTIONS,HEAD,GET,POST,PUT,DELETE,TRACE和CONNECT.作為Web服務器,至少需實現GET和HEAD方法,其他方法都是可選的。
GET方法是向指定的資源發出去請求,發送的信息顯示在URL后面。GET方法應該只用在讀取數據,如靜態圖片等數據。
POST方法是向指定資源提交數據,請求服務器進行處理。
GET方法像是使用明信片給別人寫信,“信內容”寫在外面,接觸到的人都可以看到,不安全。
POST方法像是把“信內容”裝入到信封中給別人寫信,接觸到的人都看不到,因此是安全的。
HTTPS
HTTPS即安全產文本傳輸協議,是超文本傳輸協議和SSL的組合。提供加密通信及對網絡服務器身份的鑒定。
簡單地說。HTTPS是HTTP的升級版。與HTTPS的區別是,HTTPS使用https://代替http://,HTTPS使用端口443,而HTTP使用端口80和TCP/IP進行通信。SSL使用40位關鍵字作為RC4流加密算法。這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證。如果需要,用戶可以確認發送者是誰。
使用XMLHttpRequest對象開發客戶端
在Web前端開發中有一種異步刷新技術-AJAX。
AJAX的核心是JavaScript對象XMLHTTPRequest,該對象在Internet Explore5中首次引入,它是一種支持異步請求的技術。借助於XMLHttpRequest對象可以使用JavaScript語言向服務器提出請求並處理響應。
使用XMLHttpRequest對象
由於在Web中使用XMLHttpRequest對象發出HTTP請求和普遍,Cocos2d-JS引擎對其平台進行了移植。可以在cocos2d-JS JSB本地平台和Cocos2d-html的web平台中使用了XMLHttpRequest對象。
XMLHttpRequest對象中常用的函數和屬性如下:
1、open() 與服務器連接,創建新的連接請求。
2、send() 向服務器發送請求。
3、abort()退出當前請求
4、readyState屬性,提供當前請求的狀態,其中4表示准備就緒。
5、status屬性,提供當前的HTTP請求狀態碼,其中200表示請求成功。
6、responseText屬性,服務器返回的請求響應文本。
7、onreadystatechange屬性,設置回調函數。
其中,open和send函數,以及onreadystatechange屬性是http請求的關鍵。
open函數有5個參數可以使用。(method,url,async,user,password)
method,是指發送請求的類型,一般為GET或POST
url,要請求的鏈接url
async,是否為異步請求,該參數可選,默認是true
user,如果該請求需要身份驗證,這里指定用戶名,無默認值
password,,如果該請求需要身份驗證,這里指定密碼,無默認值
XML HttpRequest中有5種就緒狀態:
1、0:請求沒有發出,在調用open()函數之前為該狀態
2、1:請求已經建立但還沒有發出,在調用send()函數之前為該狀態
3、2:請求已經發出正在處理中
4、3:請求已經處理,響應中通常有部分數據可用,但是服務器還沒有完成響應
5、4:響應已經完成,可以訪問服務器響應並使用它
常見的HTTP狀態碼如下:
401:表示所訪問數據禁止訪問
403:表示所訪問數據收到保護
404:表示錯誤的URL請求,表示請求的服務器資源不存在
200:表示一切順利
如果就緒狀態是4而且狀態碼是200即可處理服務器的數據
這里是GET方式請求
var httpHelper = {}; httpHelper.get = function(url, callback){ var request = cc.loader.getXMLHttpRequest(); console.log("Status: Send Get Request to " + url); request.open("GET", url, true); request.onreadystatechange = function () { if (request.readyState == 4 && (request.status >= 200 && request.status <= 207)) { var httpStatus = request.statusText; var response = request.responseText; console.log("Status: Got GET response! " + httpStatus); callback(true, request); }else{ callback(false, request); } }; request.send(); };
使用如下
var reqUrl = "";
httpHelper.get(reqUrl, function (isSuccess, data) {});
這里是POST方式:
httpHelper.post = function(url,params,callback){ var nums = arguments.length if(nums == 2){ callback = arguments[1]; params = ""; } var xhr = cc.loader.getXMLHttpRequest(); xhr.open("POST", url); xhr.setRequestHeader("Content-Type","text/plain;charset=UTF-8"); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status <= 207)) { err = false; }else{ err = true; } var response = xhr.responseText; callback(err,response); }; xhr.send(params); }
使用如下:
httpHelper.post("http://127.0.0.1:3000/test","id=1&ids=2", function(err,data){ if(err){ //錯誤處理 }else{ cc.log(data); } })