當有客戶端的狀態更新時都會給服務器發送presence消息,從而觸發PresenceUpdateHandler中的process方法,此方法首先判斷presence包中的type,分爲以下幾種方案:
1.type爲空
說明是第一次發送狀態消息,
首先,服務器調用broadcastUpdate方法廣播該消息給所有的好友,由於我們項目中不需要了解用戶的在線狀態,故將broadcastUpdate方法註釋掉,
然後,是初始化session的過程,initSession方法中首先檢測該用戶所有好友的在線狀態,然後發送給該用戶,此步驟無用,故註釋掉,
之後,從數據庫中提取用戶的離線消息,發送給用戶,該方法我們做了聊天服務器,用戶發送presence信息時將最後一次收到消息的時間發送給服務器,服務器截取之後的離線消息發送給用戶
最後,將type設置爲available
2.type爲unavailable
說明用戶下線,發送廣播通知所有好友該用戶下線,此步驟無用,故註釋
private void broadcastUpdate(Presence update) {
// 取消廣播發送在線消息
// if (update.getFrom() == null) {
// return;
// }
// if (localServer.isLocal(update.getFrom())) {
// // Do nothing if roster service is disabled
// ...
}
之後會把該session的狀態設置爲available,並調用SessionManager中的方法通知該id的其他resource此狀態,此步驟無用,故注視
private void broadcastPresenceOfOtherResource(LocalClientSession session) {
// if (!SessionManager.isOtherResourcePresenceEnabled()) {
// return;
// }
// ...
}