iOS網(wǎng)絡(luò)編程之TCP/IP應(yīng)用篇(二)-框架的二次封裝

上篇文章貼出了頭文件的定義巩趁,現(xiàn)在來(lái)逐一實(shí)現(xiàn)和說(shuō)明。

uint8_t m_pBuffer[SOCKET_TCP_BUFFER] 和int m_nBufferLen

SOCKET_TCP_BUFFER 宏定義16384丛楚,m_pBuffer為總長(zhǎng)度為16384個(gè)字節(jié)的數(shù)組,為網(wǎng)絡(luò)緩沖區(qū),保存socket接收的字節(jié)流呀伙。

m_nBufferLen 準(zhǔn)確的說(shuō)是一個(gè)標(biāo)識(shí)位,記錄緩沖區(qū)的數(shù)據(jù)的長(zhǎng)度(這個(gè)變量在解析緩沖區(qū)數(shù)據(jù)時(shí)要用到)添坊。

id<SocketDelegate>?delegate ? 解析數(shù)據(jù)完成后進(jìn)行分發(fā)的接口(在第三篇中會(huì)詳細(xì)說(shuō)明)剿另。

AsyncSocket*m_pSocket ?保存第三方封裝socket的實(shí)例。

一贬蛙,初始化api,這個(gè)實(shí)現(xiàn)很簡(jiǎn)單雨女,對(duì)變量進(jìn)行初始化,初始化后我們就有了可以調(diào)用的socket(m_pSocket)

/**創(chuàng)建*/

+ (instancetype)CreateTcpIPStream:(id)delegate

{

return [[TCPIPStreamalloc] initTcpIPSteam:delegate];

}

/**初始化*/

- (instancetype)initTcpIPSteam:(id)delegate

{

if(self= [super init]) {

_m_pSocket= [[AsyncSocketalloc]initWithDelegate:self];

_delegate= delegate;

m_nBufferLen=0;

}

return self;

}

二阳准,建立連接

1氛堕,每次重新連接服務(wù)器時(shí)都要將緩沖區(qū)相關(guān)變量設(shè)置成初始值,將buffer設(shè)置成0野蝇;

2讼稚,連接服務(wù)器前一定要判斷該socket斷開(kāi)位喂,否則會(huì)報(bào)錯(cuò);

3乱灵,網(wǎng)路檢測(cè)塑崖,是檢查設(shè)備網(wǎng)絡(luò)情況;

4痛倚,調(diào)用- (BOOL)connectToHost:(NSString*)hostname onPort:(UInt16)port error:(NSError**)errPtr 與服務(wù)器建立連接

? ? 根據(jù)errPtr的錯(cuò)誤信息做處理规婆;

5,這個(gè)是避免鎖屏的時(shí)候socket斷開(kāi)(不處理會(huì)拋異常)

-(void)CreateConnectWithAddress:(NSString*)address port:(uint)port

{

//清零數(shù)據(jù)

m_nBufferLen=0;

memset(m_pBuffer,0,sizeof(uint8_t)*SOCKET_TCP_BUFFER); ?//1

//重置網(wǎng)絡(luò)

[self.m_pSocket disconnect]; ? ? ? ?//2

//網(wǎng)絡(luò)檢測(cè) ? ? ? ? ? ?//3

//連接網(wǎng)絡(luò)這里要處理是否鏈接成功

NSError*erro;

if(self.m_pSocket==nil) {

self.m_pSocket= [[AsyncSocketalloc]initWithDelegate:self];

}

BOOLisSuccess = [self.m_pSocket connectToHost:addresson Port:porterror:&erro]; ?//4

NSLog(@"%@",@(isSuccess));

NSAssert(isSuccess,@"連接失敗");

//設(shè)置鎖屏連接不斷 ?//5

CFReadStreamSetProperty([self.m_pSocketgetCFReadStream],kCFStreamNetworkServiceType,kCFStreamNetworkServiceTypeVoIP);

CFWriteStreamSetProperty([self.m_pSocketgetCFWriteStream],kCFStreamNetworkServiceType,kCFStreamNetworkServiceTypeVoIP);

}

三蝉稳,發(fā)送數(shù)據(jù)

為了安全抒蚜,可以在發(fā)送前進(jìn)行加密

-(bool)SendToServer:(uint8_t*)pData size:(uint)nDataSize

{

//這里處理加密

//發(fā)送數(shù)據(jù)

[self.m_pSocket writeData:[NSDatadataWithBytes:pData length:nDataSize]withTimeout:-1tag:0];

returnYES;

}

四,接收數(shù)據(jù)

接收數(shù)據(jù)接口的實(shí)現(xiàn)是根據(jù)客戶(hù)端與服務(wù)端自定義協(xié)議實(shí)現(xiàn)的耘戚,后面我回專(zhuān)門(mén)用一篇文章來(lái)講這部分的實(shí)現(xiàn)嗡髓。-(void) onSocket:(AsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag

五,?關(guān)閉

-(void)ClosedStream

{

[self.m_pSocket disconnect];

}

六收津,協(xié)議實(shí)現(xiàn)

與服務(wù)器連接成功后饿这,會(huì)回調(diào)這個(gè)函數(shù),在此函數(shù)調(diào)用讀取數(shù)據(jù)的api撞秋,當(dāng)有數(shù)據(jù)來(lái)時(shí)就會(huì)回調(diào)-(void) onSocket:(AsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag长捧。

/**建立連接后調(diào)用*/

- (void)onSocket:(AsyncSocket*)sock didConnectToHost:(NSString*)host port:(UInt16)port

{

[self.m_pSocket readDataWithTimeout:-1tag:0];

}

這個(gè)socket關(guān)閉(正常或異常)時(shí)會(huì)調(diào)用吻贿,這里是處理斷線(xiàn)重連的地方串结,在網(wǎng)絡(luò)開(kāi)發(fā)中,網(wǎng)絡(luò)的切換舅列,前后臺(tái)切換都會(huì)導(dǎo)致連接斷開(kāi)肌割,很好的處理這些情況會(huì)很大程度上提高用戶(hù)體驗(yàn),后面會(huì)具體講處理的思路帐要。

-(void) onSocket:(AsyncSocket*)socket willDisconnectWithError:(NSError*)err

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末把敞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宠叼,更是在濱河造成了極大的恐慌先巴,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冒冬,死亡現(xiàn)場(chǎng)離奇詭異伸蚯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)简烤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)剂邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人横侦,你說(shuō)我怎么就攤上這事挥萌〈乱觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵引瀑,是天一觀(guān)的道長(zhǎng)狂芋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)憨栽,這世上最難降的妖魔是什么帜矾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮屑柔,結(jié)果婚禮上屡萤,老公的妹妹穿的比我還像新娘。我一直安慰自己掸宛,他們只是感情好死陆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著唧瘾,像睡著了一般措译。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劈愚,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天瞳遍,我揣著相機(jī)與錄音闻妓,去河邊找鬼菌羽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛由缆,可吹牛的內(nèi)容都是我干的注祖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼均唉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼是晨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舔箭,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤罩缴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后层扶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體箫章,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年镜会,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檬寂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戳表,死狀恐怖桶至,靈堂內(nèi)的尸體忽然破棺而出昼伴,到底是詐尸還是另有隱情,我是刑警寧澤镣屹,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布圃郊,位于F島的核電站,受9級(jí)特大地震影響女蜈,放射性物質(zhì)發(fā)生泄漏描沟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一鞭光、第九天 我趴在偏房一處隱蔽的房頂上張望吏廉。 院中可真熱鬧,春花似錦惰许、人聲如沸席覆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佩伤。三九已至,卻和暖如春晦毙,著一層夾襖步出監(jiān)牢的瞬間生巡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工见妒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孤荣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓须揣,卻偏偏與公主長(zhǎng)得像盐股,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耻卡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容