0

是否有一种简单有效的方法来获取打开给定网页的访问者数量?

最终目标是这样做:

  1. 检查页面上有多少访问者,即在浏览器中打开了页面的访问者。
  2. 如果超过一定数量n,则显示一个按钮。按下按钮的第一批x访问者将转到不同的页面。
  3. 只要n访问者超过,按钮就会一直显示。如果没有,按钮就会消失。

这样做有什么诀窍吗?长轮询?网络套接字?越简单越好。

4

3 回答 3

2

使用 WebSockets 可以轻松完成此任务。下面是使用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 回答