iOS CocoaAsyncSocket總結(jié)

參考博客
最近看了看socket,也學(xué)習(xí)到了一點點東西,在這里記錄一下,以免忘記。

socket能夠?qū)崿F(xiàn)兩個應(yīng)用程序之間的數(shù)據(jù)交換,比如說A和B用QQ聊天,就是A將數(shù)據(jù)發(fā)送給服務(wù)端,服務(wù)端將數(shù)據(jù)發(fā)送給B。這三者之間的數(shù)據(jù)發(fā)送、轉(zhuǎn)換、接收,循環(huán)往復(fù)。
在發(fā)送數(shù)據(jù)的時候會出現(xiàn)粘包,斷包的問題。在這里我學(xué)會了一種處理這種問題的思路。
首先要了解下面幾個方法的作用

[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:110];

[sock readDataToLength:packetLength withTimeout:-1 tag:110];

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

[GCDAsyncSocket CRLFData] 可以直接理解為換行符 \n

第一個方法表示,讀取數(shù)據(jù),讀取到\n這個位置停止。
第二個方法表示,按照數(shù)據(jù)的長度進(jìn)行讀取。
第三方方法表示,每次收到消息,都會調(diào)用這個方法。

我們發(fā)送數(shù)據(jù)的時候,都需要轉(zhuǎn)化為data類型進(jìn)行發(fā)送,所以說,我們可以取到每次發(fā)送數(shù)據(jù)的長度,data.length;
由于我們會發(fā)送字符串,圖片,視頻等等不同的類型,所以說,我們可以把類型,大小封裝成一個json字符串,然后拼接上 \n,即 [GCDAsyncSocket CRLFData],然后我們再拼接上數(shù)據(jù)。

當(dāng)服務(wù)端收到我們發(fā)送的數(shù)據(jù)時,調(diào)用[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:110]; 讓其讀到第一個 \n,然后獲取到數(shù)據(jù)長度,調(diào)用[sock readDataToLength:packetLength withTimeout:-1 tag:110]; 服務(wù)端就能讀取到我們這一次發(fā)送的數(shù)據(jù),循環(huán)往復(fù),直到讀完為止。這樣就不會出現(xiàn)粘包、斷包的問題。
當(dāng)然,處理這種問題的方法很多,只要能夠?qū)崿F(xiàn)功能,都可以。

測試
此時沒有寫服務(wù)端,怎么測試?

可利用:nc -lk 端口號:始終監(jiān)聽本地計算機(jī)此端口的數(shù)據(jù)。

eg:nc -lk 6666;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容