詳細代碼可參考引擎目錄下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。web
首先須要include WebSocket的頭文件。服務器
#include "network/WebSocket.h"
cocos2d::network::WebSocket::Delegate定義了使用WebScocket須要監聽的回調通知接口。使用WebSocket的類,須要public繼承這個Delegate。websocket
class WebSocketTestLayer: public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate
並Override下面的4個接口:socket
virtual void onOpen(cocos2d::network::WebSocket* ws);virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);virtual void onClose(cocos2d::network::WebSocket* ws);virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
後面咱們再詳細介紹每一個回調接口的含義。ide
WebSocket.org 提供了一個專門用來測試WebSocket的服務器」ws://echo.websocket.org」。
測試代碼以連接這個服務器爲例,展現如何在Cocos2d-x中使用WebSocket。測試
新建一個WebSocket:this
cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();
init第一個參數是delegate,設置爲this,第二個參數是服務器地址。
URL中的」ws://」標識是WebSocket協議,加密的WebSocket爲」wss://」.加密
_wsiSendText->init(*this, "ws://echo.websocket.org")
在調用send發送消息以前,先來看下4個消息回調。spa
init會觸發WebSocket連接服務器,若是成功,WebSocket就會調用onOpen,告訴調用者,客戶端到服務器的通信鏈路已經成功創建,能夠收發消息了。指針
void WebSocketTestLayer::onOpen(network::WebSocket* ws){ if (ws == _wsiSendText) { _sendTextStatus->setString("Send Text WS was opened."); }}
network::WebSocket::Data對象存儲客戶端接收到的數據,
isBinary屬性用來判斷數據是二進制仍是文本,len說明數據長度,bytes指向數據。
void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data){ if (!data.isBinary) { _sendTextTimes++; char times[100] = {0}; sprintf(times, "%d", _sendTextTimes); std::string textStr = std::string("response text msg: ")+data.bytes+", "+times; log("%s", textStr.c_str()); _sendTextStatus->setString(textStr.c_str()); }}
無論是服務器主動仍是被動關閉了WebSocket,客戶端將收到這個請求後,須要釋放WebSocket內存,並養成良好的習慣:置空指針。
void WebSocketTestLayer::onClose(network::WebSocket* ws){ if (ws == _wsiSendText) { _wsiSendText = NULL; } CC_SAFE_DELETE(ws);}
客戶端發送的請求,若是發生錯誤,就會收到onError消息,遊戲針對不一樣的錯誤碼,作出相應的處理。
void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error){ log("Error was fired, error code: %d", error); if (ws == _wsiSendText) { char buf[100] = {0}; sprintf(buf, "an error was fired, code: %d", error); _sendTextStatus->setString(buf); }}
在init以後,咱們就能夠調用send接口,往服務器發送數據請求。send有文本和二進制兩中模式。
發送文本
_wsiSendText->send("Hello WebSocket, I'm a text message.");
發送二進制數據(多了一個len參數)
_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));
這是讓整個流程變得完整的關鍵步驟, 當某個WebSocket的通信再也不使用的時候,咱們必須手動關閉這個WebSocket與服務器的鏈接。close會觸發onClose消息,然後onClose裏面,咱們釋放內存。
_wsiSendText->close();