是否有一種簡單高效的方式來獲取打開指定網頁的訪問者數量?如何獲得打開指定網頁的當前用戶數
的最終目標是要做到這一點:
- 檢查有多少遊客有在頁面上,即誰擁有的頁面在瀏覽器中打開。
- 如果它超過了某個數字
n
,顯示一個按鈕。按下按鈕的第一個x
訪問者將轉到不同的頁面。 - 只要有超過
n
的訪問者,該按鈕將繼續顯示。如果沒有,該按鈕消失。
這樣做的任何詭計?長輪詢? WebSocket的?越簡單越好。
是否有一種簡單高效的方式來獲取打開指定網頁的訪問者數量?如何獲得打開指定網頁的當前用戶數
的最終目標是要做到這一點:
n
,顯示一個按鈕。按下按鈕的第一個x
訪問者將轉到不同的頁面。n
的訪問者,該按鈕將繼續顯示。如果沒有,該按鈕消失。這樣做的任何詭計?長輪詢? WebSocket的?越簡單越好。
那麼你可以使用像你提到的WebSocket的,或者只是簡單的AJAX每100ms輪詢服務器,並且直到Websocket還沒有關閉,或者直到服務器沒有從瀏覽器得到響應500ms用戶使用AJAX「連接」。
而剛剛添加的所有那些被連接到一個頁面,根據自己的頁面,不同的IP的一個頁面上的數據庫用戶,並指望他們一旦有一個特定的頁面上n
條目返回到所有瀏覽器的響應,顯示按鈕。
如果有不到n
只發送一個響應來隱藏按鈕。
您的網站是靜態的,然後使用
如果你的網站是動態的,那麼 數據庫中的計數器保存頁面名稱
我不認爲這是我想要的。我需要知道*當前有哪些用戶打開特定頁面的用戶數量,而不是*已經訪問的用戶數量*頁面。 – skyork
這個任務可以使用的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應用程序容器。
這種類型的功能稱爲用戶存在。在Pusher,我們有[存在渠道](http://pusher.com/docs/presence_channels),但其他實時網絡技術可能以其他方式提供存在功能。 – leggetter