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