大家在玩游戲或使用QQ等IM工具時,想必都見到過彈出被頂號或者是您的賬號于xx時間在另一設(shè)備登錄,您已被迫下線這樣的提示,然后不得不點退出按鈕退出整個應(yīng)用,或者點擊重新登錄把另一設(shè)備再頂下來。最近我參與的一個項目,正好就有這樣的需求,而且,由于我們項目中已經(jīng)使用到了MQTT協(xié)議進(jìn)行消息推送,實現(xiàn)遠(yuǎn)程控制,后臺用Java實現(xiàn),緩存使用了Redis,因此,正好可以利用現(xiàn)有的技術(shù)來實現(xiàn)這個功能。 實現(xiàn)的思路大概如下:首先,登錄時不僅需要賬號密碼,還可以將設(shè)備關(guān)鍵信息記錄下來,如設(shè)備型號(Android|iPhone)、登錄時間、登錄IP、設(shè)備唯一標(biāo)識(UUID)等,這就需要前臺登錄功能與后臺接口一起配合實現(xiàn),并在后臺把userId已經(jīng)相關(guān)設(shè)備信息保存到Redis中,當(dāng)在另外一臺新設(shè)備上登錄同一賬號時,將userId對應(yīng)的相關(guān)登錄設(shè)備信息直接進(jìn)行覆蓋,此時如果舊設(shè)備進(jìn)行重連時,因為該uuid已經(jīng)不是當(dāng)前服務(wù)端的uuid了,所以直接返回下線通知,為了進(jìn)行友好提示,也可以將新登錄設(shè)備的主要信息(設(shè)備型號、登錄時間)進(jìn)行返回。 下面簡單介紹一下實現(xiàn)的方法。 軟件安裝Linux下mqtt服務(wù)器Apollo的安裝下載選擇一個目錄用來下載保存 創(chuàng)建broker一個broker實例是一個文件夾,其中包含所有的配置文件及運行時的數(shù)據(jù),不如日志和消息數(shù) 首先解壓:tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz 開始創(chuàng)建broker實例:
下圖是Apache官方給的一些建議截圖: 啟動broker實例啟動broker實例可以有兩種方法,如下圖中所示: 可以執(zhí)行
或者
使其作為一個service進(jìn)行啟動,以后系統(tǒng)重啟后只需運行/etc/init.d/apollo-broker-service start 訪問Apollo的監(jiān)控頁面: http://localhost:61680/默認(rèn)用戶名、密碼為為 admin/password Linux下Redis的安裝與配置Redis的安裝非常簡單,已經(jīng)有現(xiàn)成的Makefile文件,解壓后在src目錄下使用make命令完成編譯即可,redis-benchmark、redis-cli、redis-server、redis-stat 這四個文件,加上一個 redis.conf 就構(gòu)成了整個redis的最終可用包。它們的作用如下: redis-server:Redis服務(wù)器的daemon啟動程序 下載安裝:
啟動編譯后生成的可執(zhí)行文件: ./redis-server & 不指定配置直接運行,這時采用默認(rèn)配置,無密碼 最好還是使用最后一種方式進(jìn)行啟動 如果只是在本機連接,那麼使用默認(rèn)配置文件不會有什么問題,但是,如果是連接遠(yuǎn)程服務(wù)器端的Redis,則需要對配置文件進(jìn)行一些修改:
至于如何將Redis設(shè)置后臺服務(wù),開機自啟等,這里就不介紹了,可以去搜索一下。 功能實現(xiàn)后臺接口Redis客戶端使用的是Jedis,如下代碼是一個對Jedis簡單的封裝
然后在登錄接口中,當(dāng)判斷完登錄的用戶名密碼正確后,可以參考如下代碼的思路去實現(xiàn),首先判斷Redis中是否已保存有這個userId對用的值,有的話說明當(dāng)前已經(jīng)有登錄,需要被替換到,同時使用MQTT發(fā)送消息給客戶端使其退出,Redis中不存在則只需保存userId和uuidStr即可
至于MQTT協(xié)議的實現(xiàn),這里使用的是Paho,如果后臺項目是使用Maven構(gòu)建的話,在pom.xml中加入如下幾行即可:
然后對其進(jìn)行了一個簡單的封裝
app端客戶端的做法思路也很簡單,由于使用了MQTT,因此客戶端和服務(wù)器端其實已經(jīng)保持了一個長連接,可以為客戶端寫一個MQTTService,隨時監(jiān)聽服務(wù)器推送過來的消息進(jìn)行處理
總結(jié)上述代碼可能在嚴(yán)謹(jǐn)性和可靠性上還會存在一些問題,還需要經(jīng)過不斷的完善,但思路是很明確的。在這里尤其要安利一下MTQQ,現(xiàn)在越來越多的產(chǎn)品都是基于這個協(xié)議進(jìn)行開發(fā),進(jìn)行消息推送等。它開銷很小,支持各種流行編程語言,能夠適應(yīng)不穩(wěn)定的網(wǎng)絡(luò)傳輸需求,在未來幾年,相信MQTT的應(yīng)用會越來越廣。 |
|