【问题标题】:how to get the current number of users who have a given web page open如何获取打开给定网页的当前用户数
【发布时间】:2012-10-08 12:47:12
【问题描述】:

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

最终目标是这样做:

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

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

【问题讨论】:

  • 这种类型的功能称为用户状态。在 Pusher,我们有 presence channels,但其他实时网络技术可能会以其他方式提供呈现功能。

标签: javascript web-applications websocket long-polling


【解决方案1】:

使用 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 应用程序容器。

【讨论】:

    【解决方案2】:

    好吧,您可以像您提到的那样使用 Websocket,也可以只使用简单的 AJAX 每 100 毫秒轮询一次服务器,直到 Websocket 没有关闭或服务器在 500 毫秒内没有从浏览器获得响应,然后用户使用 AJAX “连接”。

    并且只需根据他们的页面和页面上的不同 ip 将所有连接到页面的用户添加到数据库中,并在特定页面上有 n 条目时对它们进行计数,返回对所有浏览器的响应显示按钮。

    如果少于n,只需发送响应以隐藏按钮。

    【讨论】:

      【解决方案3】:

      您的网站是静态的,然后使用

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

      如果您的网站是动态的,那么 使用页面名称将计数器保存在数据库中

      【讨论】:

      • 我认为这不是我想要的。我需要知道当前打开特定页面的用户数量,而不是访问过该页面的用户数量。
      猜你喜欢
      • 1970-01-01
      • 2012-12-21
      • 2018-03-01
      • 2015-10-15
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多