Cocos 2 d WebSocketプロトコルの簡単な例

4623 ワード


WebSocket protocolはHTML 5の新しいプロトコルです.ブラウザとサーバのフルデュプレクス通信を実現します.ブラウザとサーバのインスタント通信を実現します.つまり、サーバもクライアントに積極的にメッセージを送信することができます.
 
WebSocketエージェントクラスとメソッド:
cococos 2 dは同様にwebsocketをカプセル化した.WebSocketとWebSocket::Delegate 1:WebSocket:WebSocketクラスは、Websocketに関連する操作方法を提供します.その役割は、1、socketオブジェクトの作成2、サーバへのデータ送信、テキストデータであってもよいし、バイナリデータであってもよい3、リンク状態enum class ErrorCode{TIME_OUT,CONNECTION_FAILURE,UNKNOWN,}を判断すること、などなど.2:WebSocket::Delegate:Socketに似ています.WebSocket::Delegateは4つの純粋な虚関数を提供し、websocketを使用する場合はDelegateクラスを継承し、4つの虚関数を実装する必要があります.
 
WebSocketオブジェクトを作成し、テキストデータを送信します.
オブジェクトの作成:cococos 2 d::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パッケージを使用します.cocos 2 dで定義された構造体です.結果は、struct Data{Data():bytes(nullptr)、len(0)、issued(0)、isBinary(false){}char*bytes;        ssize_t len, issued;         bool isBinary;     }; 4つのフィールドがあります.bytesはデータを格納し、lenはデータの長さを格納します.isBinaryはbytesに格納されているデータがテキストデータなのかバイナリデータなのかを識別します.データ構造体を用いてデータを得ると,これらのデータを用いることができる.
コード操作:
ヘッダファイル:
#ifndef __TestWebSocketScene_SCENE_H__
#define __TestWebSocketScene_SCENE_H__

#include "cocos2d.h"
#include "network\WebSocket.h"
USING_NS_CC;

using namespace cocos2d::network;
class TestWebSocket : public cocos2d::Layer
	,WebSocket::Delegate
{
	public:
		static cocos2d::Scene* createScene();
		virtual bool init();
		CREATE_FUNC(TestWebSocket);
   
		virtual void onOpen(WebSocket *ws);
		virtual void onMessage(WebSocket *ws,const WebSocket::Data &data);
		virtual void onClose(WebSocket *ws);
		virtual void onError(WebSocket *ws,const WebSocket::ErrorCode& error);

	private:
		//     
		WebSocket *wsText;
};

#endif // __TestWebSocketScene_SCENE_H__

ソースファイル:
#include "TestWebSocketScene.h"

Scene* TestWebSocket::createScene()
{
    auto scene = Scene::create();
    auto layer = TestWebSocket::create();
    scene->addChild(layer);
    return scene;
}

bool TestWebSocket::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
	Size size = Director::getInstance()->getWinSize();
	wsText = nullptr;

	auto menu = Menu::create();
	menu->setPosition(Vec2::ZERO);
	addChild(menu);

	auto lblSendText = Label::create("init websocket","Arial",22);
	auto menuSendText = MenuItemLabel::create(lblSendText,[=](Ref *sender){
		wsText = new WebSocket();
		//        
		if( !wsText->init(*this,"ws://echo.websocket.org")){
			//         
			CC_SAFE_DELETE(wsText);
		};
	});
	menuSendText->setPosition(size/2);
	menu->addChild(menuSendText);

	auto lblSend = Label::create("send","Arial",22);
	auto menuSend = MenuItemLabel::create(lblSend,[=](Ref *sender){
		if (wsText!=nullptr)
		{
			//     
			wsText->send("hello websocket.");
		}
	});
	menuSend->setPosition(size.width/2,size.height/2-50);
	menu->addChild(menuSend);

	auto lblSendBinary = Label::create("sent Binary","Arial",22);
	auto menuSendBinary = MenuItemLabel::create(lblSendBinary,[=](Ref *sender){
		if (wsText!=nullptr)
		{
			char buffer[] = "hello \0 binary";
			wsText->send((unsigned char *)buffer,sizeof(buffer));
		}
	});
	menuSendBinary->setPosition(size.width/2,size.height/2-100);
	menu->addChild(menuSendBinary);

    return true;
}

void TestWebSocket::onOpen(WebSocket *ws){
	log("webSocket (%p) open",ws);
	// webSocket  http  tag         
	// webSocket            
	if (ws==wsText)
	{
		log("WebSocket send Text open");
	}
	
}

void TestWebSocket::onMessage(WebSocket *ws,const WebSocket::Data &data){
	log("webSocket (%p) receive message",ws);
	if (!data.isBinary)
	{//    
		log("received message is :%s",data.bytes);
	}else//        
	{
		std::string result;
		for (int i = 0; i < data.len; i++)
		{
			if (data.bytes[i]!='\0')
			{
				result +=data.bytes[i];
			}else
			{
				result += "\'\\0\'";
			}
		}
		log("received binary data is: %s",result.c_str());
	}
}

void TestWebSocket::onClose(WebSocket *ws){
	log("webSocket (%p) close",ws);
	if (ws==wsText)
	{
		log("WebSocket send Text close");
	}
}

void TestWebSocket::onError(WebSocket *ws,const WebSocket::ErrorCode &error){
	log("WebSocket (%p) error",ws);
	if (ws==wsText)
	{
		log("WebSocket send Text error");
	}
}