參考博客
最近看了看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;