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開發(fā)之TableView實(shí)現(xiàn)完整的分割線詳解
在iOS開發(fā)中, tableView是我們最常用的UI控件之一。所以這篇文章主要給大家詳細(xì)介紹了關(guān)于iOS中的TableView分割線,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12iOS項(xiàng)目開發(fā)鍵盤彈出遮擋輸入框問題解決方案
大家在用IOS開發(fā)項(xiàng)目的時(shí)候,經(jīng)常出現(xiàn)鍵盤彈出遮擋輸入框問題,小編給大家整理的這個(gè)問題的處理方法,一起學(xué)習(xí)下。2018-01-01iOS app中無網(wǎng)絡(luò)頁面的添加方法詳解
這篇文章主要給大家介紹了關(guān)于iOS app中無網(wǎng)絡(luò)頁面的添加方法的相關(guān)資料,通過文中提供的方法可以很方便的給大家進(jìn)行提供一個(gè)提醒,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01iOS創(chuàng)建對(duì)象的不同姿勢(shì)詳解
這篇文章主要介紹了iOS創(chuàng)建對(duì)象的不同姿勢(shì),文中介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-02-02IOS 開發(fā)狀態(tài)欄隱藏的實(shí)現(xiàn)辦法
這篇文章主要介紹了IOS 開發(fā)狀態(tài)欄隱藏的實(shí)現(xiàn)辦法的相關(guān)資料,需要的朋友可以參考下2017-02-02