是否有一种简单有效的方式来获取打开指定网页的访问者数量?
最终目标是:
n
,则显示一个按钮。按下按钮的第一个x
访问者将转到另一个页面。n
,该按钮就会一直显示。如果没有,按钮就会消失。这样做的诀窍?长轮询? WebSocket的?越简越好。
答案 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)
您的网站是静态的,然后使用
如果您的网站是动态的话 使用页面名称
将数据库保存在数据库中