主要介紹內容:Http協議,Socket協議,webSocket協議, Cocos2d-x中的相關類和方法
1 Http協議
HTTP協議也叫超文本傳輸協議。是互聯網廣泛使用的通信協議,常用於B/S架構中。
HTTP連接使用的是短連接形式,也就是“請求-響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求后,服務器端才能回復數據。
HTTP常用的有2種數據提交方式,分別是GET、POST。
1)get是從服務器上獲取(查詢)數據,post是向服務器傳送數據;
2) get傳送的數據量較小,不能大於2KB,post傳送的數據量較大,一般認為不受限;
3) get安全性非常低;post安全性相對來說就比較好了;
Cocos2d-x封裝了3個類來處理HTTP請求,HttpRequest、HttpClient和HttpResponse。它們在命名空間cocos2d::network中定義,所以使用時要先聲明該命名空間。
請求過程:
1. 創建 HttpRequest 的實例;
2. 設置請求方式,GET、POST等。
3. 設置請求地址和發送的數據;
4. 設置響應回調函數,在回調函數中處理獲取的數據;
5. 創建HttpClient實例,發送請求;
6. 釋放連接。
HttpRequest:是一種數據類型,它提供了一些方法用來定義或獲取HTTP請求的參數。常用方法包括下面幾種。
設置請求連接:
void setUrl(const char * url);
設置請求類型:
void setRequestType(Type type)
Type是Cocos2d-x定義的一個枚舉類型,包括5種類型。
enum class Type
{
GET,
POST,
PUT,
DELETE,
UNKNOWN,
};
設置回調函數:
void setResponseCallback(Ref * pTarget,SEL_HttpResponse pSelector )
設置請求的數據,參數buffer是提交的數據,len是請求數據的長度:
void setRequestData(const char* buffer, unsigned int len);
HttpClient:
用來控制請求相關的參數,比如發送請求,設置請求超時時間。它使用單例模型。這一模式的目的是使得類的一個對象成為系統中的唯一實例。cocos2d中多處用到這一模型。
比如Director對象,創建Director::getInstance()。
又比如,音頻處理對象: SimpleAudioEngine::getInstance();
常用方法:
發送請求:
send(HttpRequest* request)
設置連接超時時間:
setTimeoutForConnect(int value)
HttpResponse:
包含服務器返回的數據等信息。使用HttpResponse提供的方法可以獲取這些數據。
常用方法:
std::vector<char>* getResponseData();
獲取請求返回的數據:
getResponceState
獲取返回狀態,返回值是一個整數,200表示請求成功,400表示服務器錯誤,404表示服務器上找不到相應的文件。
issucced() ,用來判斷是否返回成功
2 WebSocket協議
WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信。實現瀏覽器與服務器的即時通訊。
WebSocket:
WebSocket類提供了跟websocket相關操作的方法。它的作用包括:
1、創建socket對象
2、向服務器發送數據,可以是文本數據,也可以是二進制數據
3、判斷鏈接狀態
enum class ErrorCode
{
TIME_OUT,
CONNECTION_FAILURE,
UNKNOWN,
};
等等。
WebSocket::Delegate:
類似Socket。WebSocket::Delegate提供了4個純虛函數,在使用websocket時,需要先繼承Delegate類和實現這4個虛函數。
1、virtual void onOpen(WebSocket* ws) ;
當打開websocket連接時調用
2、virtual void onMessage(WebSocket* ws, const Data& data) ;
當接收到數據時調用
3、virtual void onClose(WebSocket* ws) ;
當關閉連接時調用
4、virtual void onError(WebSocket* ws, const ErrorCode& error) ;
當發送數據但沒有建立連接,或者是收到斷開連接的信號時調用。
如何創建WebSocket對象並發送文本數據?
創建對象:
cocos2d::network::WebSocket* wsSendText = new network::WebSocket()
初始化請求地址:
wsSendText ->init(*this, "ws://echo.websocket.org")。
發送數據:
wsSendText ->send("Hello WebSocket, I'm a text message.");
如何接受數據並發送二進制數據
當服務器向客戶端發送數據,客戶端會調用onMessage方法接收返回的數據。
數據使用WebSocket::Data封裝。它是cocos2d定義的一個結構體。結果如下:
struct Data
{
Data():bytes(nullptr), len(0), issued(0), isBinary(false){}
char* bytes;
ssize_t len, issued;
bool isBinary;
};
它包含四個字段:bytes存放數據,len存放數據的長度,isBinary用來標識bytes中存放的數據是文本數據還是二進制數據。
使用Data結構體得到數據后,就可以使用這些數據了。
3 Socket通訊
Socket,俗稱網絡套接字,本身並不是協議,而是一個調用接口,是對TCP/IP協議的封裝和應用,。提供了一系列方法方便開發者進行網絡通訊。
TCP/IP協議是使用最早的通訊協議,它是傳輸層協議,主要解決數據如何在網絡中傳輸。
Socket中又分為流模式與數據報模式,即TCP與UDP兩種方式。
TCP : Transmission Control Protocol,傳輸控制協議,是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來,其中的過程非常復雜,但也是最安全的。
UDP : User Data Protocol,用戶數據報協議。傳輸數據之前源端和終端不建立連接,發送端直接把數據發送到網絡,接收端把消息段放在隊列中,應用程序每次從隊列中讀一個消息段。
3.1 Socket基礎和通信流程
Socket幾個定義:
1)IP地址:即依照TCP/IP協議分配給本地主機的網絡地址,兩個進程要通訊,任一進程首先要知道通訊對方的位置,即對方的IP。
2)端口號:用來辨別本地通訊進程,一個本地的進程在通訊時均會占用一個端口號,不同的進程端口號不同,因此在通訊前必須要分配一個沒有被訪問的端口號。
3)連接:指兩個進程間的通訊鏈路。
客戶/服務器模式:
在TCP/IP網絡應用中,通信的兩個進程間相互作用的主要模式是客戶/服務器(Client/Server, C/S)模式,即客戶向服務器發出服務請求,服務器接收到請求后,提供相應的服務。
Socket通信流程:
服務端:
1、服務器端先初始化Socket
2、當一個套接字用socket()創建后,存在一個名字空間(地址族),但它沒有被命名。bind()將套接字地址(包括本地主機地址和本地端口地址)與所創建的套接字號聯系起來,即將名字賦予套接字,以指定本地半相關
3、對端口進行監聽(listen)
4、調用accept阻塞,等待客戶端連接。
客戶端:
1、客戶端初始化一個Socket
2、然后連接服務器(connect)
3、如果連接成功,這時客戶端與服務器端的連接就建立了。
4、客戶端發送數據請求(send),服務器端接收請求並處理請求,然后把回應數據發送給客戶端,客戶端讀取數據。
5、最后關閉連接,一次交互結束。
3.2 SocketIO,SIODelegate和SIOClient
類似http,cocos2d對socket也進行了封裝。提供了SocketIO,SIODelegate和SIOClient三個類。
SocketIO:connet
使用單例模式,初始化Socket,獲取SIOClient。
SIODelegate:
使用Socket協議,首先要繼承SIODelegate,並且還要實現SIODelegate的4個虛函數
// 當打開socket連接時會調用這個函數
virtual void onConnect(cocos2d::network::SIOClient* client);
// 當接收到數據時會調用這個函數
virtual void onMessage(cocos2d::network::SIOClient* client, const std::string& data);
// 當socket關閉時,會調用這個函數
virtual void onClose(cocos2d::network::SIOClient* client);
// 當連接錯誤或接收到錯誤信號時會調用這個函數
virtual void onError(cocos2d::network::SIOClient* client, const std::string& data);
SIOClient:
處理Socket的一系列動作,比如,發送數據,監聽事件,斷開連接等
