0

特定の Web ページを開いている訪問者の数を取得する簡単で効率的な方法はありますか?

最終的な目標は、これを行うことです。

  1. ページに何人の訪問者がいるか、つまりブラウザでページを開いている人を確認します。
  2. 一定数を超えるとnボタンを表示します。xボタンを押した最初の訪問者は別のページに移動します。
  3. 以上のn訪問者がいる限り、ボタンは表示され続けます。そうでない場合、ボタンは消えます。

これを行うためのトリックはありますか?ロングポーリング?ウェブソケット? シンプルなほど良い。

4

3 に答える 3

2

このタスクは、WebSocket を使用して簡単に実行できます。以下はBristleback Serverを使用して記述された必要なアプリケーション コードです(新しいユーザーが接続するときにチェックが実行されると仮定します)。

@Component
public class CountUsersConnectionListeners implements ConnectionStateListener<DefaultUser> {

  private static final int MAGIC_MAXIMUM_NUMBER_OF_USERS = 2;

  private int numberOfCurrentlyConnected;

  @Autowired
  private ConnectionCountClientClass connectionCountClientClass;

  @Override
  public void userConnected(DefaultUser defaultUser) {
    if (numberOfCurrentlyConnected > MAGIC_MAXIMUM_NUMBER_OF_USERS) {
      connectionCountClientClass.showButtonToNewUser(defaultUser);
      numberOfCurrentlyConnected++;
      return;
    }

    numberOfCurrentlyConnected++;
    if (numberOfCurrentlyConnected > MAGIC_MAXIMUM_NUMBER_OF_USERS) {
      connectionCountClientClass.showButton(true);
    }
  }

  @Override
  public void userDisconnected(DefaultUser defaultUser) {
    if (numberOfCurrentlyConnected <= MAGIC_MAXIMUM_NUMBER_OF_USERS) {
      numberOfCurrentlyConnected--;
      return;
    }

    numberOfCurrentlyConnected--;
    if (numberOfCurrentlyConnected <= MAGIC_MAXIMUM_NUMBER_OF_USERS) {
      connectionCountClientClass.hideButton(true);
    }
  }
}

これは単なるプロトタイプであることに注意してください。同期については気にしませんでした。実際の接続ユーザー数を設定するコードは別の場所に置くことができます。


@ClientActionClass
@Component
public class ConnectionCountClientClass {

  @ClientAction
  public SendCondition showButton(boolean show) {
    return AllUsersCondition.getInstance(); // this will send a message to all connected users
  }

  @ClientAction
  public SendCondition hideButton(boolean hide) {
    return AllUsersCondition.getInstance(); // this will send a message to all connected users
  }

  @ClientAction
  public DefaultUser showButtonToNewUser(DefaultUser defaultUser) {
    return defaultUser; // this will send a message only to the user given as parameter
  }
}

クライアント側 (追加のアプリケーション コードのみ表示):

var sampleClientAction = {
  showButton: function() {
    alert("Show button!");
  },
  showButtonToNewUser: function() {
    alert("Show me button!");
  },
  hideButton: function() {
    alert("Hide button!");
  }
};

dataController.registerClientActionClass("ConnectionCountClientClass", sampleClientAction);

興味があれば、作業中のアプリケーション全体をお送りします [Maven が必要です]。Jetty または Tomcat を Web アプリケーション コンテナーとして使用できます。

于 2012-10-08T14:05:23.463 に答える
1

あなたが言及したような Websocket を使用するか、単純な AJAX を使用して 100 ミリ秒ごとにサーバーをポーリングし、Websocket が閉じられないか、サーバーがブラウザーから 500 ミリ秒応答を取得しないまで、ユーザーは "接続」を AJAX を使用して行います。

そして、ページに接続しているすべてのユーザーを、ページとページ上の個別の IP に基づいてデータベースに追加nし、特定のページにエントリがあると、ボタンを表示するためにすべてのブラウザーに応答を返します。

nそして、ボタンを非表示にするための応答を送信するだけではありません。

于 2012-10-08T13:02:01.180 に答える
0

あなたのサイトは静的ですそして使用してください

http://www.kavoir.com/2010/05/simplest-php-hit-counter-or-download-counter-count-the-number-of-times-of-access-visits-or-downloads.html

サイトが動的である場合は、ページ名を使用してカウンターをデータベースに保存します

于 2012-10-08T13:03:11.770 に答える