2012-10-08 91 views
0

是否有一種簡單高效的方式來獲取打開指定網頁的訪問者數量?如何獲得打開指定網頁的當前用戶數

的最終目標是要做到這一點:

  1. 檢查有多少遊客有在頁面上,即誰擁有的頁面在瀏覽器中打開。
  2. 如果它超過了某個數字n,顯示一個按鈕。按下按鈕的第一個x訪問者將轉到不同的頁面。
  3. 只要有超過n的訪問者,該按鈕將繼續顯示。如果沒有,該按鈕消失。

這樣做的任何詭計?長輪詢? WebSocket的?越簡單越好。

+0

這種類型的功能稱爲用戶存在。在Pusher,我們有[存在渠道](http://pusher.com/docs/presence_channels),但其他實時網絡技術可能以其他方式提供存在功能。 – leggetter

回答

1

那麼你可以使用像你提到的WebSocket的,或者只是簡單的AJAX每100ms輪詢服務器,並且直到Websocket還沒有關閉,或者直到服務器沒有從瀏覽器得到響應500ms用戶使用AJAX「連接」。

而剛剛添加的所有那些被連接到一個頁面,根據自己的頁面,不同的IP的一個頁面上的數據庫用戶,並指望他們一旦有一個特定的頁面上n條目返回到所有瀏覽器的響應,顯示按鈕。

如果有不到n只發送一個響應來隱藏按鈕。

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

相關問題