Cocos2d-x v3.x 官方文檔]C++版如何使用WebSocket

在C++中使用

詳細代碼可參考引擎目錄下的/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並初始化

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")

WebSocket消息監聽

在調用send發送消息以前,先來看下4個消息回調。spa

onOpen

init會觸發WebSocket連接服務器,若是成功,WebSocket就會調用onOpen,告訴調用者,客戶端到服務器的通信鏈路已經成功創建,能夠收發消息了。指針

void WebSocketTestLayer::onOpen(network::WebSocket* ws){
    if (ws == _wsiSendText)
    {
        _sendTextStatus->setString("Send Text WS was opened.");
    }}

onMessage

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());
    }}

onClose

無論是服務器主動仍是被動關閉了WebSocket,客戶端將收到這個請求後,須要釋放WebSocket內存,並養成良好的習慣:置空指針。

void WebSocketTestLayer::onClose(network::WebSocket* ws){
    if (ws == _wsiSendText)
    {
        _wsiSendText = NULL;

    }
    CC_SAFE_DELETE(ws);}

onError

客戶端發送的請求,若是發生錯誤,就會收到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);
    }}

send消息到服務器

在init以後,咱們就能夠調用send接口,往服務器發送數據請求。send有文本和二進制兩中模式。

發送文本

_wsiSendText->send("Hello WebSocket, I'm a text message.");

發送二進制數據(多了一個len參數)

_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));

主動關閉WebSocket

這是讓整個流程變得完整的關鍵步驟, 當某個WebSocket的通信再也不使用的時候,咱們必須手動關閉這個WebSocket與服務器的鏈接。close會觸發onClose消息,然後onClose裏面,咱們釋放內存。

_wsiSendText->close();
相關文章
相關標籤/搜索