2016年7月25日月曜日

SignalRと接続イベント(サーバ)

SignalR には、各クライアントが、あるHubと接続を確立したタイミング、切断したタイミングで呼び出されるコールバックメソッドが用意されている。

以下、3種類がサーバ側のコールバックとして用意されている。

  • サーバ側のコールバッ一覧

No
メソッド名
いつ呼び出されるか?
1
OnConnected()
クライアント側から接続されたときに呼び出される
2
OnReconnected()
ネットワークの再接続(一時的な切断からの復帰)があったときに呼び出される
3
OnDisconnected(bool stopCalled)
クライアント側から切断されたときに呼び出される


自身で作ったHubクラス内で、上記のメソッドオーバーライドして利用する。
このコールバックを使えば、各ユーザの接続時の初期化だとか、逆に、居なくなったユーザーの削除などが出来る。

とりあえず、例として、前の投稿ページのコードに、チャットを閲覧している人数を表示するように、機能を追加してみる。

ChartHubへのコード追加


誰かが接続/切断する度に、人数をカウントする処理を追加。

// 普通のメンバだと複数回の呼び出しにまたがる情報を保存できないので、静的メンバに
private static int CountOfMember { get; set; }

// 接続時に呼び出される
public override Task OnConnected()
{
   // メンバーを一人増やす
   this.UpdateMemberCount(1);

   return base.OnConnected();
}

// 切断時に呼び出される
public override Task OnDisconnected(bool isStopCalled)
{
   // 引数の「isStopCalled」がtrueになるのは、クライアント側で明示的に切断した場合

   // メンバーを一人減らす
   this.UpdateMemberCount(-1);

   return base.OnDisconnected(isStopCalled);
}

// 接続が再接続された場合に呼び出される。
public override Task OnReconnected()
{
   return base.OnReconnected();
}

// チャット参加人数の更新とクライアントへの通知を行うメソッド
private void UpdateMemberCount(int number)
{
   ChatHub.CountOfMember += number;
   Clients.All.updateMemberCount(ChatHub.CountOfMember);
}

Chat のViewに対する追加

閲覧人数を表示する部分の追加


受け取った人数を表示するHTMLコードを追加。
とりあえず、以下のようなものを。
<div>閲覧人数:<span id="memberCount"></span></div>

ChatHubから呼び出されるupdateMemberCountの作成


Hubから呼び出されるメソッド部分の実装を追加。
chat.client.updateMemberCount = function (newCount) {
           $("#memberCount").text(newCount);
};

起動すると、”閲覧人数:”の横に、1が表示されているはず。
そして、別のタブ、別のウィンドウで同じ画面を表示させる度に、全画面の人数が一人ずつ増え、タブ/ウィンドウを閉じるたびに、人数が減るはず。

ユーザーが初めてHubに接続したタイミング、あるいは、Hubとの接続を切断したタイミングに実施したい処理は、色々とあるはず(初回だけ実施したい処理、内部的な初期化、後始末など)なので、込み入った処理をSignalRで実現する場合には、それなりに使うタイミングがあると思われる。

以上。

0 件のコメント:

コメントを投稿