3

私は、HttpServlet を介して 2 つのクライアント間でボード ゲームを実装する宿題プロジェクトに取り組んでいます。いくつか質問があります:

1)HttpServletsはステートレスでなければならないことを読みましたが、ゲームのために、多くの状態(誰の番か、ボードの状態など)を保持する必要があります。これをクライアントに保持する必要がありますか?HttpServlet は実際にステートレスである必要がありますか。つまり、状態を追跡するフィールドがありませんか?

2) クライアントが doGet/doPost メソッドを介してサーブレットと通信することはわかっていますが、サーブレットがクライアントと通信するにはどうすればよいでしょうか (たとえば、プレーヤー 1 が移動してサーブレットに送信した場合、サーブレットはクライアント 2 に移動の内容を伝えます)。

ありがとうございました

また、オンラインで同様のコードの便利で簡単な例を教えていただければ、非常に感謝しています。

4

4 に答える 4

3
  1. HTTP プロトコルはステートレスであるため、HttpServlet. サーブレット API を使用して、サーバー側でセッション状態を維持できます。セッション管理のチュートリアルを読んでください。

  2. H TML auto-refreshCometHTML 5 の WebSocketなどの技術など、いくつかの手法があります。

于 2012-08-16T02:18:15.713 に答える
2

サーブレットは複数のリクエストを処理できる必要があります。ステートレスである必要はありませんが、典型的なマルチスレッドの問題を回避するためにその状態を管理する必要があります。明らかに、同じ世界にアクセスする必要がある 2 人のユーザーがいる場合、そのためのメカニズムが必要です。不正行為や悪意のあるクライアントを回避する以外の理由がなければ、おそらくサーバーはゲームの状態を追跡するのに役立ちます.

さまざまなオプションがあります。クライアントは移動の更新をポーリングでき、ロングポーリングなどを使用できます。

于 2012-08-16T02:14:50.880 に答える
1

他の人はすでに#1をカバーしています。

#2の推奨事項を作成します。もう 1 つのオプションは、AJAX (Asynchronous Javascript and XML) を簡単に調べることです。「舞台裏」の HTTP リクエストを起動し、ユーザーがページを更新する必要なくページを調整できます。クライアントは、数秒ごとにサーバーで更新を確認してボードを更新する JavaScript を持つことができる HTML ページをロードできます。

ここに小さな例があります。また、ブラウザ固有の JavaScript を気にしたくない場合は、jQuery をいじることができます。ajaxリクエストを起動するための非常にユーザーフレンドリーなAPIがあり、ブラウザ固有のものを処理します.

編集

#1 - サーブレットは、すべてのリクエストを処理するために使用されますが、並行して処理される可能性があります。ゲームボードをサーブレット b/c に直接配置することはできません。20 人が同じゲームを編集しようとする可能性があります。

public class GameServlet extends HttpServlet {
   private GameBoard board; // everyone would share the same board!

いくつかのオプションがあり、ユーザーがアクセスするコレクションにボードを保存できます。HttpSession も参照してください。HttpSession は、サーブレットが追跡するサーバー側メモリのセクションであり、リクエスト間でアクセスできます。

public void doGet(HttpServletRequest req, HttpServletResponse resp) {

  HttpSession session = req.getSession();
  session.setAttribute("board", new GameBoard());  // this way each user will have their own game board

  // and you can retrieve it in another HTTP request
  GameBoard board = session.getAttribute("board");
}

ボードの更新は実際には 2 つのユーザーのボードを更新する必要があるため、HttpSession の使用は少し難しいかもしれません。ユーザーによって索引付けされたサーブレットのコレクション・メンバーのみを優先する場合があります。うまくいけば、それで十分です。

于 2012-08-16T02:25:41.313 に答える
0

プロトコルとしての HTTP はステートレスです (人々が言及したように)。ただし、ごく一部の http は、サーバーとクライアントの間で「Cookie」をやり取りしています。これらの Cookie は、HTTP クライアント (つまり、ブラウザー) によって相互運用される個別の RFC (http://www.ietf.org/rfc/rfc2109.txt) です。HTTP に関して言えば、Cookie はヘッダー フィールドの 1 つにすぎませんが、ブラウザーにとって特別な意味を持ちます。

サーブレット ベースのプログラムでこれらの Cookie を使用して、セッション ID をクライアント ブラウザに返す。クライアントが後続のリクエストを送信すると、同じ Cookie がそれを発行したサーバーに自動的に送り返されます。サーバーは、ユーザーセッションの識別子を認識します。これは、プログラマーにとってほとんど透過的です。

通常、Tomcat (または他のコンテナー) がこれを処理し、セッションのサーブレット要求を要求するだけです。

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

    // the parameter determines if session can be created if one does not exist for the client
    HttpSession session = req.getSession(true); 

    session.setAttribute("attName", attValue);
}

セッションを使用して、属性を保存/取得できます。一般的なゲームの状態については、別の場所 (ある種のゲーム マネージャー オブジェクト) に保存する必要がありますが、ユーザーの現在のゲーム ID をユーザーのセッションに保存することもできます。これにより、サーブレットはユーザーに適したゲームを見つけることができます。 . ユーザーが手を動かすと、これを示す http リクエストを介してゲームの状態が更新されます。両方のユーザーは、ゲームの現在の状態、最近の動きなどを尋ねるために定期的に http 要求を行う必要があります....

于 2012-08-16T02:51:41.093 に答える