國內大部分android定制機,已經(jīng)把google服務(wù)都刪除了(gmail/google map/market),導致基于google C2DM的消息推送無(wú)法運行。我們可以考慮自己做一個(gè)server端,用長(cháng)連接來(lái)實(shí)現消息推送。
有2種方案:
1)用socket實(shí)現長(cháng)連接
優(yōu)點(diǎn):可以用SocketChannel來(lái)打開(kāi)套接字連接,因為它實(shí)現了接口InterruptibleChannel(jdk1.4),可以被其它線(xiàn)程中斷read,
缺點(diǎn):socket可能會(huì )受到防火墻的限制
2)用http實(shí)現長(cháng)連接
優(yōu)點(diǎn):server端可以使用servlet3.0的新特性:servlet異步,來(lái)維持長(cháng)連接。
缺點(diǎn):read無(wú)法被其它線(xiàn)程中斷。
這里選用方案2,使用如下方法來(lái)避免客戶(hù)端read不能被中斷的情況:
當客戶(hù)端不想接受消息的時(shí)候,發(fā)個(gè)消息("logout")給服務(wù)器,然后服務(wù)器向客戶(hù)端推送一個(gè)消息("logout"),之后,服務(wù)器、客戶(hù)端的長(cháng)連接結束。
服務(wù)器端功能:
1) DeployServlet、deploy.jsp,頁(yè)面顯示當前與服務(wù)器連接的用戶(hù),一個(gè)信息輸入框,管理員輸入信息,選擇連接的用戶(hù),點(diǎn)擊發(fā)送按鈕,然后就把消息推送到客戶(hù)端,(客戶(hù)端可以是瀏覽器、android app、java app、、、、)
2) NotificationServlet,一個(gè)支持異步處理的servlet,客戶(hù)端訪(fǎng)問(wèn)這個(gè)servlet后,
如果有logout參數,則服務(wù)器給客戶(hù)端發(fā)個(gè)logout消息,然后長(cháng)連接中斷;
否則就建立長(cháng)連接。

android客戶(hù)端功能:
1) 輸入用戶(hù)名,然后與服務(wù)器端建立長(cháng)連接。
2) 接收服務(wù)器端推送過(guò)來(lái)的消息并顯示到notification bar上面。


server端采用了servlet3.0的新特性,可以用Tomcat7.0作為容器,
客戶(hù)端不一定是android,可以任意,如瀏覽器,只要訪(fǎng)問(wèn)了http://localhost:8080/notification/notification.do?username=troy就建立了長(cháng)連接。
聯(lián)系客服