天天看點

socket長連接配接的用處與子產品圖

select 出錯! errno:22(EINVAL)。

維護socket長連接配接雖然很耗電,但是卻有廣泛的用途。如:網絡電話,實時接單的應用等,優先IMP4的push功能,推送,IM。

很多小公司為了減少開發難度,用個推當派單的方式,這樣的做法是架構上的錯誤。個推不能參與業務,隻能當簡單的消息提示用。個推在高峰期延遲很嚴重,不同的人收到延遲10秒--30分鐘很正常。就會出現有的使用者收到推送的消息,有的使用者收不到消息或收到時早過期的情況。這種有實時群推送的業務一定要用長連接配接。不然每個公司通過個推伺服器做,那樣也太容易了吧?怎麼可能呢?若你的業務不是對實時性要求很高可以用第三方socket庫,若你的應用對實時性,複雜移動網絡,粘包處理要求很高,那還是自己寫長連接配接吧!

由于伺服器域名固定,手機用戶端的網絡IP可能不斷變更,伺服器一般想主動找手機用戶端想說聲不容易。營運商發現手機經常不用網絡時(大部分省份判斷手機用戶端最近30分鐘内是否使用流量,來判斷你的手機是否在用網絡,若有流量就不把你IP分給别人),會把你的手機以前使用的IP配置設定給其它手機号,所有蘋果把蘋果手機網絡定義為不穩定的網絡,禁止釋出的應用嚴重依賴網絡的穩定性。是以服務和用戶端隻有建立可靠的socket長連接配接,每9分鐘發送一次請求才能保持你IP不配置設定給别人,并且有服務需要向用戶端下達訂單時,可以通過這個長連接配接快速推送到手機用戶端。要别APNS轉了一大圈穩定,延遲小,也解決蘋果對短期内推送大量類似資訊被蘋果伺服器攔截的問題。

網絡電話的原理也很簡單。兩個手機開啟應用,經過伺服器建立SOCKET長連接配接聲音和視訊格式流媒體資料流就可以了,當然要打電話是,對方收到網絡電話請求消息時,彈出本地通知播放一段音樂就就可以了。網絡電話簡單吧!是否有開公司的沖動。這也是電話,電報的基本原理,他們都要通過伺服器中轉,伺服器起到早期的電話接線員的角色。

盡量把業務邏輯放在SOCKET的子線程裡面處理,盡量減少外部接口,要把外部接口設計成不會并發發送的接口。你想一想,你把業務接口都封裝為外部接口,當你調用外部接口發送請求時,若子線程沒有在通路發送對象數組,會把發送消息寫入發送對象數組;若子線程在通路發送對象數組,你隻能把外部發送的消息放入臨時消息中,若此時你竟敢放入發送對象數組就會出現發送對象數組長度的變法,衆所周知,當一個線程在通路一個數組時,若數組元素個數變化,會出現數組越界或數組個數不可以預知的崩潰。這個我在測試時實際遇到過,并且截獲到崩潰桟。

是以若有能力還是自己寫SOCKET,把自己的業務邏輯也包含進來,盡量減少外部調用接口,禁止通過SOCKET并發發送消息,把你的需要傳回的外部接口通過BLOCK進行封裝。若有能力盡量别用第三方SOCKET庫,不然它封裝的是很好,但是越适用的場景廣泛,那麼針對個别特殊情況的處理越力不從心。如:第三方庫從來沒有考慮過SOCKET建立完成,有的情況可讀不可寫的情況,網卡緩沖區滿了就會出現可讀不可以

寫的情況。通用和全面本來就不可以兼得,全面必然會讓你的程式複雜。通用就要求簡潔,符合大部分要求,而非全部場景。

繼續閱讀