ASP.NET Core版 対人対戦できるぷよぷよをつくる(9)の続きです。ときどきゲーム中に通信が切れてしまうことがあります。これまでは自分で通信を切断した場合と同じ処理(試合放棄)をしていましたが、意図せず切れてしまった場合は再接続してゲームが途中で終わらないようにします。

クライアントサイドにおける処理

通信が切れるとこれまで以下のような処理をしていました。

JavaScript

ここを再接続する処理に置き換えればよいです。0.5秒後、1秒後、2秒後に再接続を試みます。3秒待っても再接続が完了しない場合はあきらめます。

接続に成功したときの処理を追加します。

接続に成功したらconnectionIDのバックアップをとっています。切断⇒再接続にともなってconnectionIDが変更されてしまうので、サーバーサイドにこのペアを送信して同一ユーザーであることを知らせなければなりません。isReconnectedがtrueならこの処理が必要です。このときは古いconnectionIDと新しいconnectionIDといっしょに”Reconnected”を送信します。

通信の切断とともにisPlayingがfalseになってしまいます。そのため再接続に成功したら1秒待機してからisPlayingをtrueに変更しています。同時に通信が切れた旨を示す文字列を非表示にします。

サーバーサイドにおける処理

クライアントサイドから”Reconnected”が送信されたら対応するConnectionIdsプロパティをもつPuyoMatchGameオブジェクトを探します。また再接続されたユーザーは観戦者かもしれません。該当するオブジェクトが見つかったらConnectionIdsプロパティの文字列を入れ替えます。

通信が切断されたときの処理を示します。これまでは通信が切れたらすぐに試合放棄の処理をしていましたが、今回からはすぐにその処理をおこなわずに3秒待機します。もし3秒待ってもReconnectedメソッドの呼び出しがない場合はほんとうに試合放棄と見なして処理をおこないます。