如何获得打开给定网页的当前用户数

时间:2012-10-08 12:47:13

标签: javascript web-applications websocket long-polling

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

最终目标是:

  1. 检查页面上有多少访问者,即谁在浏览器中打开了页面。
  2. 如果超过某个数字n,则显示一个按钮。按下按钮的第一个x访问者将转到另一个页面。
  3. 只要访问者超过n,该按钮就会一直显示。如果没有,按钮就会消失。
  4. 这样做的诀窍?长轮询? WebSocket的?越简越好。

3 个答案:

答案 0 :(得分: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应用程序容器。

答案 1 :(得分:1)

那么你可以像你提到的那样使用Websocket,或者只是简单的AJAX每隔100ms轮询一次服务器,直到Websocket没有被关闭或服务器没有得到从浏览器响应500毫秒然后用户连接&#34;使用AJAX。

只需将连接到页面的所有用户添加到基于页面和页面上不同IP的数据库中,并在特定页面上返回n个条目后对其进行计数响应所有浏览器以显示按钮。

如果小于n,只需发送一个回复来隐藏按钮。

答案 2 :(得分: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

如果您的网站是动态的话 使用页面名称

将数据库保存在数据库中