向手機推送消息是一個比較常用的功能,向IOS推送消息的時候,消息都是要先推送到蘋果的通知服務(wù)(APNS)上,再由蘋果推送到客戶端
在安卓中沒有類似APNS這樣的服務(wù),如果我們自己開發(fā)了手機APP,推送的功能就需要我們自己來實現(xiàn),一般情況下,客戶端會建立一個長連接連到服務(wù)器端,然后服務(wù)器端有消息的話會立即通知到客戶端,為了節(jié)省服務(wù)器資源和同時支持許多客戶端連接,服務(wù)器端會將連接進行共享,不會給每個連接到服務(wù)器端的客戶端都建立一個連接.
使用netty來自己實現(xiàn)一個異步的通信框架或者使用servlet容器提供的異步的方案都是可以行的,在我們的項目中使用了jetty-continuations(這是jetty的一個子模塊,不僅僅可以在jetty中使用,jetty7之后的版本可以在任何支持servlet3.0的servlet容器中運行),它和異步的servlet類似,但是簡化了異步servlet的編程模型,使我們可以更快速地把這個東西使用起來
continuations有幾個要點:
服務(wù)器端和客戶端建立長連接
將請求信息和continuation進行綁定(例如:張三的客戶端請求消息,從請求中獲取的continuation和張三綁定,然后把這些綁定信息存儲起來,服務(wù)器再向張三推送消息的時候能夠找到這個continuation,然后重用)
沒有消息要發(fā)送的時候,執(zhí)行continuation的suspend()方法,將請求掛起
當(dāng)需要發(fā)送新的消息的時候,執(zhí)行continuation的resume()方法重新激活請求
具體的例子可以參考我的github:https://github.com/jiaoyiping/websample.git