即時(shí)通訊之CocoaAsyncSocket使用(二)

一夏哭、簡(jiǎn)介

CocoaAsyncSocket是谷歌的開發(fā)者,基于BSD-Socket寫的一個(gè)IM框架,可在github下載 乡摹,它給Mac和iOS提供了易于使用的再层、強(qiáng)大的異步套接字庫(kù),向上封裝出簡(jiǎn)單易用OC接口秽五。省去了我們面向Socket以及數(shù)據(jù)流Stream等繁瑣復(fù)雜的編程孽查。其結(jié)構(gòu)框架簡(jiǎn)介示意圖如下:

image.png

整個(gè)庫(kù)就這么兩個(gè)類,一個(gè)基于TCP坦喘,一個(gè)基于UDP盲再。其中基于TCP的GCDAsyncSocket,大概8000多行代碼瓣铣。而GCDAsyncUdpSocket稍微少一點(diǎn)答朋,也有5000多行。

1.GCDAsyncSocket.

用GCD搭建的基于TCP/IP協(xié)議的socket網(wǎng)絡(luò)庫(kù)
GCDAsyncSocket is a TCP/IP socket networking library built atop Grand Central Dispatch. -- 來(lái)源于CocoaAsyncSocket.

2.GCDAsyncUdpSocket

用GCD搭建的基于UDP/IP協(xié)議的socket網(wǎng)絡(luò)庫(kù).
GCDAsyncUdpSocket is a UDP/IP socket networking library built atop Grand Central Dispatch..--來(lái)源于CocoaAsyncSocket.

二棠笑、客戶端

因?yàn)?大部分項(xiàng)目已經(jīng)有服務(wù)端socket,所以,先講解客戶端創(chuàng)建過(guò)程.

步驟:

1.繼承GCDAsyncSocketDelegate協(xié)議.

2.聲明屬性

// 客戶端socket
@property (strong, nonatomic) GCDAsyncSocket *clientSocket梦碗;

3.創(chuàng)建socket并指定代理對(duì)象為self,代理隊(duì)列必須為主隊(duì)列.

self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

4.連接指定主機(jī)的對(duì)應(yīng)端口.

NSError *error = nil;
self.connected = [self.clientSocket connectToHost:self.addressTF.text onPort:[self.portTF.text integerValue] viaInterface:nil withTimeout:-1 error:&error];

5.成功連接主機(jī)對(duì)應(yīng)端口號(hào).

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port 
{
//    NSLog(@"連接主機(jī)對(duì)應(yīng)端口%@", sock);
    [self showMessageWithStr:@"鏈接成功"];
    [self showMessageWithStr:[NSString stringWithFormat:@"服務(wù)器IP: %@-------端口: %d", host,port]];
 
    // 連接成功開啟定時(shí)器
    [self addTimer];
    // 連接后,可讀取服務(wù)端的數(shù)據(jù)
    [self.clientSocket readDataWithTimeout:- 1 tag:0];
    self.connected = YES;
}
IP---其中的IP服務(wù)器的IP地址

6、向服務(wù)器發(fā)送數(shù)據(jù)
向服務(wù)器發(fā)送數(shù)據(jù)主要通過(guò)- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag 來(lái)向后臺(tái)發(fā)送數(shù)據(jù)的

- (IBAction)sendMessageAction:(id)sender
{
    NSData *data = [self.messageTextF.text dataUsingEncoding:NSUTF8StringEncoding];
    // withTimeout 0 : 等待時(shí)間
    // tag : 消息標(biāo)記
    [self.clientSocket writeData:data withTimeout:0 tag:0];
}

7蓖救、讀取數(shù)據(jù)

/**
 讀取數(shù)據(jù)
 
 @param sock 客戶端socket
 @param data 讀取到的數(shù)據(jù)
 @param tag 本次讀取的標(biāo)記
 */
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{
    NSString *text = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    [self showMessageWithStr:text];
    // 讀取到服務(wù)端數(shù)據(jù)值后,能再次讀取
    [self.clientSocket readDataWithTimeout:- 1 tag:0];
}
主要通過(guò)方法-(void) readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag來(lái)進(jìn)行的

8洪规、斷開連接

/**
 客戶端socket斷開
 
 @param sock 客戶端socket
 @param err 錯(cuò)誤描述
 */
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    [self showMessageWithStr:@"斷開連接"];
    self.clientSocket.delegate = nil;
    self.clientSocket = nil;
    self.connected = NO;
    [self.connectTimer invalidate];
}

9、建立心跳
心跳連接中發(fā)送給服務(wù)端的數(shù)據(jù)只是作為測(cè)試代碼,根據(jù)你們公司需求,或者和后臺(tái)商定好心跳包的數(shù)據(jù)以及發(fā)送心跳的時(shí)間間隔.客戶端發(fā)送心跳包,服務(wù)端也需要有對(duì)應(yīng)的心跳檢測(cè),以此檢測(cè)客戶端是否在線.

 // 計(jì)時(shí)器
@property (nonatomic, strong) NSTimer *connectTimer;
 
// 添加定時(shí)器
- (void)addTimer
{
     // 長(zhǎng)連接定時(shí)器
    self.connectTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(longConnectToSocket) userInfo:nil repeats:YES];
     // 把定時(shí)器添加到當(dāng)前運(yùn)行循環(huán),并且調(diào)為通用模式
    [[NSRunLoop currentRunLoop] addTimer:self.connectTimer forMode:NSRunLoopCommonModes];
}
 
// 心跳連接
- (void)longConnectToSocket
{
    // 發(fā)送固定格式的數(shù)據(jù),指令@"longConnect"
    float version = [[UIDevice currentDevice] systemVersion].floatValue;
    NSString *longConnect = [NSString stringWithFormat:@"123%f",version];
 
    NSData  *data = [longConnect dataUsingEncoding:NSUTF8StringEncoding];
 
    [self.clientSocket writeData:data withTimeout:- 1 tag:0];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藻糖,一起剝皮案震驚了整個(gè)濱河市淹冰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巨柒,老刑警劉巖樱拴,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洋满,居然都是意外死亡晶乔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門牺勾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)正罢,“玉大人,你說(shuō)我怎么就攤上這事驻民》撸” “怎么了履怯?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)裆泳。 經(jīng)常有香客問(wèn)我叹洲,道長(zhǎng),這世上最難降的妖魔是什么工禾? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任运提,我火速辦了婚禮,結(jié)果婚禮上闻葵,老公的妹妹穿的比我還像新娘民泵。我一直安慰自己,他們只是感情好槽畔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布栈妆。 她就那樣靜靜地躺著,像睡著了一般厢钧。 火紅的嫁衣襯著肌膚如雪签钩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天坏快,我揣著相機(jī)與錄音铅檩,去河邊找鬼。 笑死莽鸿,一個(gè)胖子當(dāng)著我的面吹牛昧旨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祥得,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兔沃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了级及?” 一聲冷哼從身側(cè)響起乒疏,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饮焦,沒想到半個(gè)月后怕吴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡县踢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年转绷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硼啤。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡议经,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煞肾,我是刑警寧澤咧织,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站籍救,受9級(jí)特大地震影響拯爽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钧忽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逼肯。 院中可真熱鬧耸黑,春花似錦、人聲如沸篮幢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)三椿。三九已至缺菌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搜锰,已是汗流浹背伴郁。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛋叼,地道東北人焊傅。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狈涮,于是被迫代替她去往敵國(guó)和親狐胎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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