2018-11-28接入WebSocket

WebSocket

以前沒用過倒彰,之前寫過一篇博客是基于原生socket的(查看)比較復(fù)雜披摄,慎入褐捻。今天另外一個(gè)APP需要接websocket了,然后便找到了facebook的

SocketRocket

框架父腕,然后用了一天時(shí)間接上了弱匪,完成了掉線自動(dòng)重連,自動(dòng)重登錄璧亮,心跳等等功能萧诫,用法比原生socket簡(jiǎn)單(原生socket基于TCP/UDP協(xié)議)。

為什么用 WebSocket

因?yàn)锳PP里面有個(gè)聊天功能枝嘶,需要服務(wù)器主動(dòng)推數(shù)據(jù)到APP帘饶。HTTP

通信方式只能由客戶端主動(dòng)拉取,服務(wù)器不能主動(dòng)推給客戶端群扶,如果有實(shí)時(shí)的消息及刻,要立刻通知客戶端就麻煩了,要么客戶端每隔幾秒鐘發(fā)一次請(qǐng)求竞阐,看看有沒有新數(shù)據(jù)缴饭,這種方式想想都知道耗流量電量。還一種方式就是走TCP/UDP協(xié)議服務(wù)器主動(dòng)推給你骆莹,這種方式省流量颗搂。還有就是用websocket,websocket是h5里面的東西幕垦,h5我不太會(huì)丢氢,反正它比原生socket用法簡(jiǎn)單。

用法

用 SocketRocket 框架先改,記住幾個(gè)代理方法就好了疚察,很簡(jiǎn)單。

1.創(chuàng)建和設(shè)置代理對(duì)象

SRWebSocket?*socket?=?[[SRWebSocket?alloc]?initWithURLRequest:

[NSURLRequest?requestWithURL:[NSURL?URLWithString:@"http://ip地址:端口"]];


socket.delegate?=?self;????//?實(shí)現(xiàn)這個(gè)?SRWebSocketDelegate?協(xié)議啊


[socket?open];????//?open?就是直接連接了

2.連接成功會(huì)調(diào)用這個(gè)代理方法

-?(void)webSocketDidOpen:(SRWebSocket?*)webSocket?{

????NSLog(@"連接成功仇奶,可以立刻登錄你公司后臺(tái)的服務(wù)器了貌嫡,還有開啟心跳");

}

3.連接失敗會(huì)調(diào)用這個(gè)方法,看 NSLog 里面的東西

-?(void)webSocket:(SRWebSocket?*)webSocket?didFailWithError:(NSError?*)error?{

????NSLog(@"連接失敗,這里可以實(shí)現(xiàn)掉線自動(dòng)重連衅枫,要注意以下幾點(diǎn)");

????NSLog(@"1.判斷當(dāng)前網(wǎng)絡(luò)環(huán)境嫁艇,如果斷網(wǎng)了就不要連了,等待網(wǎng)絡(luò)到來弦撩,在發(fā)起重連");

????NSLog(@"2.判斷調(diào)用層是否需要連接步咪,例如用戶都沒在聊天界面,連接上去浪費(fèi)流量");

????NSLog(@"3.連接次數(shù)限制益楼,如果連接失敗了猾漫,重試10次左右就可以了,不然就死循環(huán)了感凤。

????或者每隔1悯周,2,4陪竿,8禽翼,10,10秒重連...f(x)?=?f(x-1)?*?2,?(x=5)");

}

4.連接關(guān)閉調(diào)用這個(gè)方法族跛,注意連接關(guān)閉不是連接斷開闰挡,關(guān)閉是 [socket close] 客戶端主動(dòng)關(guān)閉,斷開可能是斷網(wǎng)了礁哄,被動(dòng)斷開的长酗。

-?(void)webSocket:(SRWebSocket?*)webSocket?didCloseWithCode:(NSInteger)code?reason:(NSString?*)reason?wasClean:(BOOL)wasClean?{

????NSLog(@"連接斷開,清空socket對(duì)象桐绒,清空該清空的東西夺脾,還有關(guān)閉心跳!");

}

5.收到服務(wù)器發(fā)來的數(shù)據(jù)會(huì)調(diào)用這個(gè)方法

-?(void)webSocket:(SRWebSocket?*)webSocket?didReceiveMessage:(id)message??{

????NSLog(@"收到數(shù)據(jù)了茉继,注意?message?是?id?類型的咧叭,學(xué)過C語(yǔ)言的都知道,id?是?(void*)??

????????void*?就厲害了烁竭,二進(jìn)制數(shù)據(jù)都可以指著佳簸,不詳細(xì)解釋?void*?了");

????NSLog(@"我這后臺(tái)約定的?message?是?json?格式數(shù)據(jù)

????????收到數(shù)據(jù),就按格式解析吧颖变,然后把數(shù)據(jù)發(fā)給調(diào)用層");

}

6.向服務(wù)器發(fā)送數(shù)據(jù)

發(fā)送的時(shí)候可能斷網(wǎng),可能socket還在連接听想,要判斷一些情況腥刹,寫在下面了

發(fā)送邏輯是,我有一個(gè) socketQueue 的串行隊(duì)列汉买,發(fā)送請(qǐng)求會(huì)加到這個(gè)隊(duì)列里衔峰,然后一個(gè)一個(gè)發(fā)出去,如果掉線了,重連連上后繼續(xù)發(fā)送垫卤,對(duì)調(diào)用層透明威彰,調(diào)用層不需要知道網(wǎng)絡(luò)斷開了。

-?(void)sendData:(id)data?{

????WEAKSELF(ws);

????dispatch_async(self.socketQueue,?^{

????????if(ws.socket?!=?nil)?{

????????????//?只有?SR_OPEN?開啟狀態(tài)才能調(diào)?send?方法啊穴肘,不然要崩

????????????if(ws.socket.readyState?==?SR_OPEN)?{

????????????????[ws.socket?send:data];????//?發(fā)送數(shù)據(jù)


????????????}?elseif(ws.socket.readyState?==?SR_CONNECTING)?{

????????????????NSLog(@"正在連接中歇盼,重連后其他方法會(huì)去自動(dòng)同步數(shù)據(jù)");

????????????????//?每隔2秒檢測(cè)一次?socket.readyState?狀態(tài),檢測(cè)?10?次左右

????????????????//?只要有一次狀態(tài)是?SR_OPEN?的就調(diào)用?[ws.socket?send:data]?發(fā)送數(shù)據(jù)

????????????????//?如果?10?次都還是沒連上的评抚,那這個(gè)發(fā)送請(qǐng)求就丟失了豹缀,這種情況是服務(wù)器的問題了,小概率的

????????????????//?代碼有點(diǎn)長(zhǎng)慨代,我就寫個(gè)邏輯在這里好了


????????????}?elseif(ws.socket.readyState?==?SR_CLOSING?||?ws.socket.readyState?==?SR_CLOSED)?{

????????????????//?websocket?斷開了邢笙,調(diào)用?reConnect?方法重連

????????????????[ws?reConnect:^{

????????????????????NSLog(@"重連成功,繼續(xù)發(fā)送剛剛的數(shù)據(jù)");

????????????????????[ws.socket?send:data];

????????????????}];

????????????}

????????}?else{

????????????NSLog(@"沒網(wǎng)絡(luò)侍匙,發(fā)送失敗氮惯,一旦斷網(wǎng)?socket?會(huì)被我設(shè)置?nil?的");

????????????NSLog(@"其實(shí)最好是發(fā)送前判斷一下網(wǎng)絡(luò)狀態(tài)比較好,我寫的有點(diǎn)晦澀想暗,socket==nil來表示斷網(wǎng)");

????????}

????});

}

7.心跳機(jī)制

心跳機(jī)制就不難了妇汗,開個(gè)定時(shí)器,問下后臺(tái)要每隔多少秒發(fā)送一次心跳請(qǐng)求就好了江滨。然后注意铛纬,斷網(wǎng)了或者socket斷開的時(shí)候把心跳關(guān)一下,省資源唬滑,不然都斷網(wǎng)了告唆,還在循環(huán)發(fā)心跳,浪費(fèi)CPU和電量晶密。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末擒悬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稻艰,更是在濱河造成了極大的恐慌懂牧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尊勿,死亡現(xiàn)場(chǎng)離奇詭異僧凤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)元扔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門躯保,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澎语,你說我怎么就攤上這事途事⊙榘茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵尸变,是天一觀的道長(zhǎng)义图。 經(jīng)常有香客問我,道長(zhǎng)召烂,這世上最難降的妖魔是什么碱工? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骑晶,結(jié)果婚禮上痛垛,老公的妹妹穿的比我還像新娘。我一直安慰自己桶蛔,他們只是感情好匙头,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仔雷,像睡著了一般蹂析。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碟婆,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天电抚,我揣著相機(jī)與錄音,去河邊找鬼竖共。 笑死蝙叛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的公给。 我是一名探鬼主播借帘,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼淌铐!你這毒婦竟也來了肺然?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤腿准,失蹤者是張志新(化名)和其女友劉穎际起,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吐葱,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡街望,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弟跑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片它匕。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窖认,靈堂內(nèi)的尸體忽然破棺而出豫柬,到底是詐尸還是另有隱情,我是刑警寧澤扑浸,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布烧给,位于F島的核電站,受9級(jí)特大地震影響喝噪,放射性物質(zhì)發(fā)生泄漏础嫡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一酝惧、第九天 我趴在偏房一處隱蔽的房頂上張望榴鼎。 院中可真熱鬧,春花似錦晚唇、人聲如沸巫财。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)平项。三九已至,卻和暖如春悍及,著一層夾襖步出監(jiān)牢的瞬間闽瓢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工心赶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扣讼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓缨叫,卻偏偏與公主長(zhǎng)得像椭符,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弯汰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 前言 本文會(huì)用實(shí)例的方式艰山,將iOS各種IM的方案都簡(jiǎn)單的實(shí)現(xiàn)一遍。并且提供一些選型咏闪、實(shí)現(xiàn)細(xì)節(jié)以及優(yōu)化的建議曙搬。 注:...
    maTianHong閱讀 2,372評(píng)論 4 12
  • IDEA Maven搭建WebSocket與iOS端的簡(jiǎn)單實(shí)現(xiàn) 本人Java新手,學(xué)習(xí)過程中嘗試Java與移動(dòng)端的...
    睡鼠zzZ閱讀 5,440評(píng)論 0 13
  • 今天我將為大家介紹常用的幾種消息推送:JMS,MQTT,XMPP,WebSocket,AMQP,友盟鸽嫂,環(huán)信纵装。 首先...
    馬小悅閱讀 2,106評(píng)論 0 7
  • 網(wǎng)絡(luò)編程 1. 概論 建立連接:通過IP或者域名來連接兩臺(tái)設(shè)備,通過端口號(hào)找到對(duì)應(yīng)的通信程序 通信協(xié)議:要傳輸?shù)臄?shù)...
    陵無山閱讀 4,107評(píng)論 0 12
  • 原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSo...
    敢夢(mèng)敢當(dāng)閱讀 8,909評(píng)論 0 50