Cocos2dx WebSocket通信を試してみる

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

前にUnityでWebSocket通信のテストを行っていたのですが、 その際に使用していたWebSocketServerにCocos2xから接続できるかやってみようと思います。

Title.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef __TITLE_SCENE_H__
#define __TITLE_SCENE_H__

#include "cocos2d.h"
#include <WebSocket.h>

USING_NS_CC;
using namespace network;

class Title : public Layer, WebSocket::Delegate
{
    //webSocket
    WebSocket* websocket;

public:
    static Scene* createScene();
    virtual bool init();
    Title();
    CREATE_FUNC(Title);
    Size window_size;
    LabelTTF* status;

    void loadWebSocket();

    //webSocket
    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);
    void sendMessage(float dt);
};

#endif // __TITLE_SCENE_H__

Title.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "Title.h"

//コンストラクタ
Title::Title()
{
    if (websocket) websocket->close();
}

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

// on "init" you need to initialize your instance
bool Title::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

    //ステータスラベルの作成    
    window_size = Director::getInstance()->getWinSize();
    status = LabelTTF::create("In connection...", "Arial", 15);
    status->setPosition(Point(window_size.width / 2 , window_size.height / 2));
    this->addChild(status);

    this->loadWebSocket();

    return true;
}

void Title::loadWebSocket()
{
    websocket = new WebSocket();

    // ドメインとポートは自分のサーバーに合わせる
    websocket->init(*this, "ws://domain.com:8080/echo");
}

void Title::onOpen(WebSocket* ws)
{
    status->setString("Successful connection");
    scheduleOnce(schedule_selector(Title::sendMessage), 1.0f);
}

void Title::onMessage(WebSocket* ws, const WebSocket::Data& data)
{
    auto *text = String::createWithFormat("%s", data.bytes);
    status->setString(text->getCString());
}

void Title::onClose(WebSocket* ws)
{
    websocket = nullptr;
    status->setString("Closed connection");
}

void Title::onError(WebSocket* ws, const WebSocket::ErrorCode& error)
{
    char buf[100] = {0};
    sprintf(buf, "Error code: %d", error);
    status->setString(buf);
}

void Title::sendMessage(float dt)
{
    if (websocket->getReadyState() == WebSocket::State::OPEN){
        status->setString("Send Message");
        websocket->send("こんにちわ、ラハルです");
    }
}

実行してみる

サーバー側

info: Wrench\ConnectionManager: Wrench\Connection: xxx.xxx.xxx.xxx:xxxx (0): Connected
info: Wrench\ConnectionManager: Wrench\Connection: xxx.xxx.xxx.xxx:xxxx (0): Handshake successful: xxx.xxx.xxx.xxx:xxxx (0) connected to /echo
debug: Wrench\ConnectionManager: Wrench\Connection: xxx.xxx.xxx.xxx:xxxx (0): Handling payload: こんにちわ、ラハルです

エミュレーター

f:id:raharu0425:20140505163312p:plain