這個解決方法已經定製下來好久了,上一段時間比較忙,沒有時間整這些東西。最近稍微好 些,不怎麼加班。因此抽空總結下,同時也分享給你們,也算是給你們一個借鑑吧!或許這並非最好的解決方案,但只要能知足當前需求的最好方案也算是最好的 解決方案,誰說不是呢!O(∩_∩)O~ 瀏覽器
咱們採用的方案以下: 服務器
先看圖 網絡
上圖的流程大體上是這樣的: 框架
手機端向PC端發送聊天內容 socket
一、手機端程序經過Socket鏈接服務器端的ServerSocket tcp
二、而後服務器端根據手機Mobile客戶端發送過來統一規範的報文或聊天內容,進行解析 spa
三、而後將解析的內容,再用smack框架轉發到openfire服務器 server
四、最後由openfire服務器向客戶端(BS、CS、PhoneClient)程序發送聊天信息。這裏的客戶端能夠是pc上的瀏覽器,pc上的桌面應用,手機應用等 blog
五、PC客戶端BS程序(用http bind方式監聽)的長鏈接監聽到openfire服務器發送過來的數據,直接在頁面中顯示 ip
一樣,PC客戶端向手機端發送聊天內容
一、PC客戶端(BS)能夠直接用http bind(xmpp 提供的http請求的長鏈接方式)直接向openfire服務器發送聊天數據;
二、而後openfire服務器接收到聊天內容的時候,這時候socket服務器中的smack框架中有一個聊天內容的監聽器
三、監聽到PC端向openfire發送的內容後,會用socket的流向手機端發送咱們定義好的報文或是聊天內容
四、手機端的socket會不停的輪詢(能夠模擬心跳式長鏈接的方式),判斷是否有消息到達,若是有則顯示
而普通的聊天程序的流程則是客戶端發送信息到openfire服務器,openfire服務器再將消息轉發給其餘客戶端。他們省去了socket服務器這部分,那咱們爲何要加上socket服務器這部分呢?
咱們這樣作也是有本身的道理的:
首先,若是讓手機端本身實現向openfire服務器發送程序的代碼,那工做量是至關大的。由於每一個手機平臺使用的語言都不一樣,每一個平臺都須要實現 向openfire服務器發送聊天信息的報文。這其實就是在作重複的工做,並且每一個平臺實現向手機端發送報文信息的技術會讓每一個手機端的開發人員都要學會 一套和openfire交互的代碼。這勢必會重複工做、重複相同業務的代碼。因此,把這些代碼放在一個tcp/ip的socket中轉服務器進行統一發 送,這也是有好處的。
其次,把因此發送消息在報文在socket服務器完成,能夠對業務進行一個統一的處理、消息過濾。
手機端被否決的解決方案,供參考
手機端用http長鏈接的方式,這個是不行的
其1、手機的移動網絡不穩定,長鏈接會常常斷掉,固然你能夠自動進行重連
其2、長鏈接一直鏈接在服務器上,佔用服務器資源。固然你可使用心跳式長鏈接或是輪詢方式
其3、手機端一直鏈接服務器會使用手機端用戶的網絡帶寬流量(流量不是免費的,客戶會怎麼想)
其4、手機端一直連着服務器,對手機的電量也有消耗(如今智能機解決電量也是一個問題)