2011-10-31 16 views
0

私はHTML5ゲームサーバーをコーディングしています。サーバーには一致のリストが含まれています。ユーザーが試合の1つに参加すると、ゲームの進捗状況や他のユーザーとのチャットなどを見ることができます。Socket.io:2つのウィンドウを開く認証済みクライアントを扱うにはどうすればよいですか?

ユーザーがサーバーに表示されたそのセッションオブジェクトの 'userid'文字列を取得します。ユーザーID文字列は、ユーザーオブジェクトを参照します。見つからない場合、新しいユーザーオブジェクトが作成され、 'userid'文字列がセッションオブジェクトに追加されます。

これにより、複数のタブ/ウィンドウを使用して複数のゲームに接続でき、同じユーザー名を表示しながら各ウィンドウに画像を表示できます。

問題は、同じユーザーが同じマッチに複数回接続されていることに対応しています。ユーザーが同じゲームに接続された2つのウィンドウを持っている場合、私はそれらに両方のウィンドウでまったく同じことを見てほしい - Facebookのようなもの。私が行うことができるように期待していた何

現在、ユーザーは試合に接続したときに、新しい「コネクション」オブジェクトが作成され、このオブジェクトに私はソケットイベントを処理など

が扱うようにしました同じイベントハンドラ関数を使用する複数のソケットのイベント。私を止める唯一の事は、ソケットイベントに 'owner'引数がないことです。メッセージを受け取るソケットへの参照がないので、メッセージを受信したソケットを除くすべてのソケットにメッセージをブロードキャストすることはできません。

SocketIOルームは、チャンネルで受信したメッセージのイベントがないため、私の要件を満たしていません。

私が代わりにしなければならないのは、各参加者が複数の接続を持つ接続オブジェクトと参加オブジェクトの両方を持つことです。これは私にとって非常に肥大しているように感じます。

別のオプションは、本当に似たような状況になっている誰かからいくつかのアドバイスが必要なスパゲッティコードを使用して記述し、閉鎖など

を活用しようと自分自身を強制することです。

+0

「チャンネルで受信したメッセージにはイベントがありません」とはどういう意味ですか?チャネル上で.send( 'foo')を呼び出すと、 'message'イベントが生成されます(これはチャネル名前空間とデフォルト名前空間の両方で同じように起こります)。そのチャンネルでカスタムイベントが必要な場合は、それらを接続することが不可能であると思われる理由は混乱していますか?正確な要件はあいまいですが、「メッセージを受信したソケットを除くすべてのソケットにメッセージをブロードキャストする」という「ブロードキャスト」方法を検討しましたか? – fourk

答えて

3

製品ソリューション:ユーザーに1つのウィンドウを使用させます。

ユーザーがすでに接続されている場合は、サーバーがこれを知っているので、あなたはすでにAwesomeGameとのオープン別のウィンドウを持っている第二のウィンドウは、のような

をダイアログを表示しています。そのウィンドウを使用するか、下のボタンをクリックしてください。

このウィンドウを使用

ユーザーがボタンをクリックすると、ユーザーを表すものとして、その接続を主張SocketIOを介してメッセージを送信します。その後、サーバーは、以前のすべての接続に対して、それらが置き換えられたことを通知します。

エンジニアリングソリューション:各クライアントに、SocketIOを使用してサーバーの認証に使用できるトークンを提供します。

HTMLが生成されて配信されるときは、ページにユーザーのIDを含めて、サーバーが知っている秘密キーで署名します。たとえば、トークンは次のようになります。

<user id>|<salt>|<SHA1 hash of uid + salt + secret key> 

クライアントが接続すると、署名されたトークンを提供することによってクライアントが認証されるまで、すべてのメッセージを無視します。サーバーはトークンを分割し、そのSocketIOクライアントが実際にそのユーザーを表すことを確認できます。

サーバーでは、pubsubシステムを使用して、開いているSocketIO接続をユーザーIDでサブスクライブします。メッセージが特定のユーザーにバインドされている場合は、ユーザーIDに発行します。

関連する問題