Gibt es eine einfache und effiziente Möglichkeit, die Anzahl der Besucher zu ermitteln, für die eine bestimmte Webseite geöffnet ist?

Das ultimative Ziel ist dies:

  1. Überprüfen Sie, wie viele Besucher sich auf der Seite befinden, d. H. Wer die Seite in ihrem Browser geöffnet hat.
  2. Wenn eine bestimmte Zahl n überschritten wird, zeigen Sie eine Schaltfläche an. Die ersten x Besucher, die die Schaltfläche drücken, wechseln zu einer anderen Seite.
  3. Solange mehr als n Besucher vorhanden sind, wird die Schaltfläche weiterhin angezeigt. Wenn nicht, verschwindet die Schaltfläche.

Irgendein Trick dafür? Lange Umfragen? Websocket? Je einfacher desto besser.

0
skyork 8 Okt. 2012 im 16:47

3 Antworten

Beste Antwort

Nun, Sie können entweder Websockets verwenden, wie Sie es erwähnt haben, oder einfach AJAX, um den Server alle 100 ms abzufragen, und bis der Websocket nicht geschlossen wurde oder bis der Server 500 ms lang keine Antwort vom Browser erhalten hat, lautet der Benutzer " verbunden "mit AJAX.

Fügen Sie einfach alle Benutzer, die mit einer Seite verbunden sind, zu einer Datenbank hinzu, basierend auf ihrer Seite und den unterschiedlichen IP-Adressen auf einer Seite, und zählen Sie sie, sobald n Einträge auf einer bestimmten Seite vorhanden sind, und geben Sie eine Antwort an alle Browser zurück, die angezeigt werden sollen die Taste.

Und wenn es weniger als n gibt, senden Sie einfach eine Antwort, um die Schaltfläche auszublenden.

1
Shedokan 8 Okt. 2012 im 13:02

Diese Aufgabe kann einfach mit WebSockets ausgeführt werden. Unten ist der erforderliche Anwendungscode angegeben, der mit Bristleback Server geschrieben wurde (vorausgesetzt, die Überprüfung wird durchgeführt, wenn ein neuer Benutzer eine Verbindung herstellt).

@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);
    }
  }
}

Beachten Sie, dass dies nur ein Prototyp ist. Die Synchronisierung war mir egal. Der Code, in dem die tatsächliche Anzahl der verbundenen Benutzer festgelegt ist, könnte an anderer Stelle platziert werden.


@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
  }
}

Client-Seite (nur zusätzlicher Anwendungscode angegeben):

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

dataController.registerClientActionClass("ConnectionCountClientClass", sampleClientAction);

Wenn Sie interessiert sind, kann ich Ihnen die gesamte Arbeitsanwendung senden [Maven erforderlich]. Jetty oder Tomcat können als Webanwendungscontainer verwendet werden.

2
voitec 8 Okt. 2012 im 14:42

Ihre Website ist statisch und wird dann verwendet

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

Wenn Ihre Site dynamisch ist, speichern Sie den Zähler in Ihrer Datenbank mit dem Seitennamen

0
Dhaval Dhami 8 Okt. 2012 im 13:03