2

Java バックエンド (Tomcat、Spring) を持つ 2 人のユーザー間で単純な ajax ゲームをしています。対戦相手がターンを行ったことを 1 人のユーザーに通知する良い方法が必要です。すべての通信はデータベースを介して行われ、対戦相手が自分のターンを終了するのを待つのは次のようになります。

while(!timeout && !opponentIsDone) {
     //...get the game record from db and check if opponent made turn
     Thread.sleep(100);
}

どうにかして sleep() でこのループを取り除き、遅延なしで (ただしタイムアウト付きで) 即座に通知を受け取ることはできますか? おそらくいくつかのグローバルな静的変数を作成してそれを介して通信できますが、同様のループが必要になるだけで、タイムアウトが小さくなる可能性があります。

ターンが完了したら、メソッドを呼び出すことはできません。これは、すべて ajax を介してブラウザーにアクセスする必要があり、そこにデータをプッシュすることはできず、プルすることしかできないためです。なので、相手を待つプロセスが必要です。

軽量でシンプルなソリューションを探しています。

ありがとう。

4

7 に答える 7

2

分散イベント(別名サブスクライバー/パブリッシャー)パターンを探していると思います。DojoFrameworkがそれを実装していると思います:http: //ajaxpatterns.org/Distributed_Events

于 2009-07-15T01:59:36.003 に答える
2

Tomcat の高度な IO (Comet) サポートを調べることができます。
http://tomcat.apache.org/tomcat-6.0-doc/aio.html

于 2009-07-15T01:24:10.010 に答える
1

通知を Web クライアントにプッシュするには、さまざまな方法があります。Gmail の IM クライアントは、この種の優れた例です。これは、多くの場合、何らかの方法でオープンな HTTP 接続を保持することによって実現されます。この一連の手法は COMET と呼ばれます。ウィキペディアにはそれに関する記事があり、このテーマに特化したブログがあります ( http://cometdaily.com/ )。

この手法を使用していない場合でも、質問で特定したアルゴリズムに対して多くの改善を行うことができます。1 つの方法は、待機/通知のようなパターンまたはサブスクライバー/パブリッシャーのアプローチを使用することです。もう 1 つは、「他のプレイヤーがターンを行うのを待っている」ページにすぐに戻り、他のプレイヤーがターンするまでそのページを数秒ごとに自動的に更新することです。

ただし、探しているソリューションは COMET スタイルの通知だと思います。

于 2009-07-15T02:14:52.957 に答える
1

ある種のグローバル静的変数がある場合は、java.util.concurrent.BlockingQueue<T> を使用できます。

BlockingQueue<Turn> handoff = new ArrayBlockingQueue<Turn>(1);

// 相手スレッド
handoff.offer(myTurn);

// 他のスレッドは
Turn を使用できます otherTurn = handoff.poll( 90, TimeUnit.SECONDS );

if ( otherTurn == null )
// その後、ターンは行われません

ArrayBlockingQueue の代わりに SynchronousQueue を使用すると、人々を簡単にお互いに待たせることができます。

もちろん、グローバルな静的である必要はありません。両方のユーザーがアクセスできるものであれば何でもかまいません。

于 2009-07-15T04:05:35.270 に答える
1

flex/flash にはリアルタイム チャットルーム システムがあります (リモート オブジェクト プログラミングを使用)。

BlazeDS (無料) http://opensource.adobe.com/blazeds/をインストールする必要があります。サンプル アプリケーションが付属しています。これをAMF技術と呼んでいます。Spring は何らかの形でこの AMF をサポートしていると思います。

http://www.adobe.com/devnet/livecycle/articles/blazeds_spring.html http://blog.springsource.com/2008/12/17/using-spring-blazeds-integration-m1/

Flash ベースの Web サイトに適しています。ただし、フラッシュを使用したくない場合は、非表示にするか、十分に小さくして、ページのコミュニケーションチャネルとして使用できると思います.

おそらく、フラッシュがサーバーからデータを受信した後に、Web ページ/JavaScript に通知する方法を見つける必要があります。

ええ、私はこの方法が少しハックであることを知っています。

于 2009-07-15T05:14:15.973 に答える
0

Tomcat に縛られていない場合は、Jetty Continuations を検討してみてはいかがでしょうか。

http://bill.burkecentral.com/2008/11/12/buggybroken-tomcat-6-comet-nio-apis/には、Tomcat NIO に関する議論があります。

于 2009-11-05T03:25:03.977 に答える