Skip to content

C++での使い方

T-Kawai0922 edited this page Apr 28, 2016 · 6 revisions

#sio::clientクラス 接続全体を管理するクラス。これのインスタンスを一つ保持して全ての操作を行う。

###sio::clientのインスタンス生成 引数なしのデフォルトコンストラクタのみpublicのため、 sio::client client; として宣言するだけ。むしろ、代入演算子などがprivate指定のため、明示的にclient=sio::client();とはできない。

###sio::clientの接続、切断 ####接続

void sio::client::connect(const std::string& uri);
  • uri : 接続先のURI。例えば"http://localhost:8000"など。
    close()を呼んでおらず、何かの拍子に切断された場合は、自動的に再接続を試みてくれる。

####切断

void sio::client::close(void);
void sio::client::sync_close(void);

前者はノンブロッキング。後者は閉じるのを待つ。基本的にはどちらも使わなくてもプログラムの終了と同時に自動的に切断される。
使うとすれば自主的に一度切断して後々再接続したい場合くらいか。

###sio::clientが管理するイベント 以下の7種類あるが、基本的にはSocket Openイベントくらいしか使わない。

  • Openイベント

通信が確立したときに発生するイベント

void sio::client::set_open_listener(con_listener const& l);//ハンドラを登録 
typedef std::function<void(void)> con_listener;//ハンドラの型
  • Failイベント

通信の確立に失敗したときに発生するイベント

void sio::client::set_fail_listener(con_listener const& l);//ハンドラを登録
typedef std::function<void(void)> con_listener;//ハンドラの型
  • Reconnectingイベント

通信を再開しようとするときに発生するイベント

void sio::client::set_reconnecting_listener(con_listener const& l);//ハンドラを登録
typedef std::function<void(void)> con_listener;//ハンドラの型
  • Reconnectイベント

通信が再開されたときに発生するイベント

void sio::client::set_reconnect_listener(reconnect_listener const& l);//ハンドラを登録
typedef std::function<void(unsigned, unsigned)> reconnect_listener;//ハンドラの型

ハンドラに引数として与えられる二つの値の意味は不明。

  • Closeイベント

通信が確立したときに発生するイベント

void sio::client::set_close_listener(close_listener const& l);//ハンドラを登録
typedef std::function<void(close_reason const& reason)> close_listener;//ハンドラの型

ハンドラの引数として与えられるclose_reasonは、以下の列挙体。

enum close_reason{
	close_reason_normal,
	close_reason_drop
};
  • Socket Openイベント

ある名前空間のSocketが開いたときに発生するイベント

void sio::client::set_socket_open_listener(socket_listener const& l);//ハンドラを登録
typedef std::function<void(std::string const& nsp)> socket_listener;//ハンドラの型

ハンドラの引数は、開いた名前空間の名前。
このイベント内で、各名前空間で発生したデータ受信イベントに対するハンドラを登録する。

  • Socket Closeイベント

ある名前空間のSocketが閉じたときに発生するイベント

void sio::client::set_socket_close_listener(socket_listener const& l);//ハンドラを登録
typedef std::function<void(std::string const& nsp)> socket_listener;//ハンドラの型

ハンドラの引数は、閉じた名前空間の名前。

#sio::socketクラス 特定の名前空間における実際の通信を行うためのクラス。直接は生成できない。 ###インスタンスの取得

sio::socket::ptr sio::client::socket(const std::string& nsp);

によって取得できる。引数には名前空間(省略した場合はデフォルト値("/"))を与える。
返り値のsio::socket::ptrstd::shared_ptr<sio::socket>のtypedef。

###データの送信(イベントの発行)

void sio::socket::emit(std::string const& name, message::list const& msglist = nullptr, std::function<void (message::list const&)> const& ack = nullptr);

で行う。nameはイベント名、msglistはデータリスト。第3引数は受信通知のハンドラ(省略可、むしろ今回のプロジェクトでは使わないでほしい)。
msglistは、複数のデータを入れることができるが、基本的にはArrayやObjectで包んで単一のデータにしてほしい。

###イベントの登録

void sio::socket::on(const std::string& event, const event_listener& listener);

で登録する。eventにイベント名を与え、listenerには受信時のハンドラを与える。
event_listenerstd::function<void(sio::event& event)>のtypedef。

###sio::eventクラス sio::socketで受信したイベントデータを格納するためのクラス。よく使いそうなのは以下の二つ。

const message::ptr& get_message();
const message::list& sio::event::get_messages();

前者は一つのデータのみを取得し、後者は複数のデータが含まれる場合に使う。
ただし、基本的には複数データであってもArrayやObjectでまとめることになるはずなので、前者でよい。