オンライン対戦できるオセロをつくる(1)の続きです。今回はサーバーサイドとクライアントサイドでデータのやりとりをするためのGameHubクラスを定義します。

準備

Microsoft.AspNetCore.SignalR.Hubクラスを継承してGameHubクラスを定義します。

インデントが深くなるので名前空間部分は省略します。

VisualStudioのプロジェクト作成でASP.NET Core Webアプリを選択を選択するとコードが自動生成されるのですが、Program.csに以下のコードを追加します。追加するのは2行だけでそれ以外は既存のコードです。

Program.cs

接続時の処理

ハブ メソッドの各呼び出しは、新しいハブ インスタンスで実行されるため、変数はすべて静的変数として定義しています。

ユーザーが接続したときにおこなわれる処理を示します。

ConnectionIdClientPairsにASP.NET SignalRで使われる一意の接続IDとIClientProxyを登録します。そして現在対戦がおこなわれているゲームの番号とプレイヤー名、エントリーし対戦相手を待っているユーザーがいればそのプレイヤー名を取得してクライアントサイドに送信します。

切断時の処理

ユーザーがページから離脱したときの処理を示します。

エントリーしているユーザーが離脱したときはエントリーは取り消されたことになるので全ユーザーに対してこれを通知します。また該当するGameオブジェクトもGamesリストから取り除きます。

エントリー時の処理

ユーザーがエントリーしたときにおこなわれる処理を示します。

すでに対戦相手の片方が決定しているGameオブジェクトがあるならそのユーザーとマッチング成立となり、Game.SetPlayerメソッドが呼び出され、対局開始となります。そのようなGameオブジェクトがない場合は新たなGameオブジェクトが生成されたあと、イベントハンドラの追加、Game.SetPlayerメソッドの呼び出しが行われ、Gamesリストに追加されます。

Gameオブジェクトへのイベントハンドラの追加

Gameオブジェクトにイベントハンドラを追加する処理を示します。

エントリー成功時の処理

エントリーが成功したときにおこなわれる処理を示します。

エントリーしたユーザーには手続きが完了したこと、それ以外のユーザーにはエントリーしたユーザー名を送信します。

マッチング成立時

ユーザーがエントリーした結果、マッチング成立した時におこなわれる処理を示します。

マッチングしたユーザーには先手または後手であることを通知します。それ以外のユーザーにはマッチング成立によって待機ユーザーがいなくなったことを通知します。

対局時の処理

ユーザーが着手しようとしたときに行われる処理を示します。

対戦中のユーザーが盤上をクリックするとその位置がサーバーサイドに送信されます。着手可能な位置であれば着手の処理がおこなわれ、盤面の状態が変更されたときはGame.StatusChangedイベントが発生します。そうでない場合はGame.Denyイベントが発生します。

ユーザーが不適切な着手をしようとしたときに行われる処理を示します。このときはGame.Denyイベントが送信されてくるので、クライアントサイドに”SendToClientDeny”を送信します。

盤面の状態が変化したときにおこなわれる処理を示します。

盤面の状態が変化(着手やそれによって石がひっくり返された、残り時間が変化したなど)したら対戦者と観戦者にこれを通知します。また全ユーザーに現在リアルタイムで観戦可能な対局に関する情報を送信します。

観戦に関する処理

ユーザーが現在おこなわれている対戦を観戦しようとしたときにおこなわれる処理を示します。

ユーザーが過去の対戦を観戦しようとしたときにおこなわれる処理を示します。