IOS中使用 CocoaAsyncSocket
Socket
如今在 iOS 里對(duì) Socket 的應(yīng)用慢慢多了起來,就一個(gè)即時(shí)通訊,很多應(yīng)用都有集成,那即時(shí)通訊功能一般來說就肯定是基于 Socket 的,Socket 這個(gè)話題我一直談?wù)摰谋容^少,一是由于看過一些 C/C++ 操作 Socket 的代碼被嚇到了一直還有心理陰影存在,二是工作里沒怎么遇到相關(guān)的需求應(yīng)用,所以也沒有去深入研究相關(guān)內(nèi)容。
還沒接觸過 Socket 編程肯定也會(huì)聽說過這幾個(gè)關(guān)鍵字:包、握手、連接、TCP、UDP 等等,Socket 編程的文章網(wǎng)上大把大把有,而作為一個(gè)初心者總是對(duì)這些 望文生怯,之前我也是如此,所以深有體會(huì),希望讀完本篇文章后你會(huì)對(duì) 在 iOS 平臺(tái)上的 Socket 編程有一個(gè)簡(jiǎn)單的了解,那就是不要怕!
Socket on iOS
在 iOS 上,哦不,應(yīng)該說 Cocoa 的世界里,Socket 編程應(yīng)該有以下幾種方式:
sys/socket.h - 系統(tǒng)底層 Socket 編程接口
CFNetwork - Core Foundation 中對(duì) socket 的封裝
NSStream - Cocoa 中對(duì) CFNetwork 的封裝
當(dāng)然,上面這些都是大哥級(jí)別的,但是就是不想寫C,我們小白當(dāng)然可以用用抽象更高的開源庫,比如:
CocoaAsyncSocket
SocketRocket
Socket.IO
CocoaAsyncSocket
之前一直沒有機(jī)會(huì)在 iOS 平臺(tái)上寫 Socket,最近遇到一個(gè)需要用 Socket 做文件上傳下載的功能,那么 iOS 上做 Socket 編程大家都知道是 CocoaAsyncSocket 一家獨(dú)大,也木有發(fā)現(xiàn)其他更好的替代品,于是簡(jiǎn)單看了看文檔,就操刀上戰(zhàn)場(chǎng)了。
CocoaAsyncSocket 是一個(gè)純 Objective-C 的開源庫,用起來非常簡(jiǎn)單,當(dāng)然也兼容了 Swift 的語法。
TCP & UDP
如果你看到 CocoaAsyncSocket 主頁的說明應(yīng)該會(huì)注意到有 TCP 和 UDP 兩套接口,簡(jiǎn)單來說就是 Socket 支持兩種協(xié)議,一個(gè)叫 TCP、一個(gè)叫 UDP;TCP 面向連接,每次請(qǐng)求需要幾次 “握手”,數(shù)據(jù)有序可靠;UDP 就簡(jiǎn)單點(diǎn),不握手了,發(fā)包也無序,不用保持連接,也不用一些其它的開傳輸開銷,帶寬消耗就更少。然后 CocoaAsyncSocket 針對(duì)于 TCP 和 UDP 分別封裝出來了兩套 API,命名分別以 TCP 或 UDP 打頭。
GCD & Run-loop
仔細(xì)觀察 CocoaAsyncSocket 對(duì)其類的命名可以發(fā)現(xiàn)除了 TCP 和 UDP 分拆成了兩套 API,一套時(shí)基于 GCD 程安全的 GCDAsyncSocket/GCDAsyncUdpSocket,一套是基于 Run-loop 的 AsyncSocket/AsyncUdpSocket,一般來說我們用基于 GCD 的封裝就好了。
在實(shí)際應(yīng)用中我想大多數(shù)需求都是基于 TCP 的,所以我們主要看看 GCDAsyncSocket,看到 GCD 不要以為其所有回調(diào)都是 GCD 的,看了源碼你就知道所有回調(diào)全是 Delegate。
GCDAsyncSocket
一般 iOS 上 socket 做 client 端居多,所以用到的一些基本操作就是 connect、read、write、disconnect,GCDAsyncSocket 的封裝非常簡(jiǎn)單,初上手可能遇到的問題就在于一個(gè)完整的 socket 操作流程的不清楚,只要摸清楚服務(wù)端的邏輯流程就很輕松了,比如需要先讀多少字節(jié),然后從結(jié)果中解析出某部分?jǐn)?shù)據(jù),然后再讀多少字節(jié),再分析數(shù)據(jù),再讀再寫...
總結(jié)
其實(shí) Socket 并沒有想象中的那么復(fù)雜,很多底層的工作框架都替我們做了,可以更集中精力在業(yè)務(wù)邏輯上。
相關(guān)文章
解決ios手機(jī)中input輸入框光標(biāo)過長(zhǎng)的問題
在項(xiàng)目中做移動(dòng)端頁面,發(fā)現(xiàn)IOS 的光標(biāo)大小很大,和安卓的完全不一樣,怎么來調(diào)整大小呢?下面小編給大家?guī)砹薸os手機(jī)中input輸入框光標(biāo)過長(zhǎng)問題的解決方法,一起看看吧2018-08-08
IOS開發(fā)Objective-C?Runtime使用示例詳解
這篇文章主要為大家介紹了IOS開發(fā)Objective-C?Runtime使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
iOS App連續(xù)閃退時(shí)上報(bào)crash日志的方法詳解
iOS App 有時(shí)可能遇到啟動(dòng)必 crash 的絕境:每次打開 App 都閃退,無法正常使用App。下面這篇文章主要給大家介紹了iOS App連續(xù)閃退時(shí)上報(bào)crash日志的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2018-04-04
iOS利用NSMutableAttributedString實(shí)現(xiàn)富文本的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于iOS利用NSMutableAttributedString如何實(shí)現(xiàn)富文本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
IOS開發(fā)代碼分享之設(shè)置UISearchBar的背景顏色
在項(xiàng)目開發(fā)中,我們經(jīng)常要用到UISearchBar,在網(wǎng)上看到了很多關(guān)于去除掉他背景色的方法,都已經(jīng)失效了,今天來分享一個(gè)正常使用的方法,希望能幫到大家2014-09-09
iOS中在APP內(nèi)加入AppStore評(píng)分功能的實(shí)現(xiàn)方法
這篇文章主要介紹了iOS中在APP內(nèi)加入AppStore評(píng)分功能的實(shí)現(xiàn)方法,文中筆者給大家整理了三種方式,大家可以根據(jù)自己的需求選擇,需要的朋友可以參考下2017-11-11

