iOS系統(tǒng)SRWebSocket的源碼解析上
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
一。 前言:
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——可以通俗的解釋為服務(wù)器主動(dòng)發(fā)送信息給客戶端。
區(qū)別于MQTT、XMPP等聊天的應(yīng)用層協(xié)議,它是一個(gè)傳輸通訊協(xié)議。它有著自己一套連接握手,以及數(shù)據(jù)傳輸?shù)囊?guī)范。
而本文要講到的SRWebSocket就是iOS中使用websocket必用的一個(gè)框架,它是用Facebook提供的。
關(guān)于WebSocket起源與發(fā)展,是怎么由:輪詢、長(zhǎng)輪詢、再到websocket的,可以看看冰霜這篇文章:
微信,QQ這類IM app怎么做——談?wù)刉ebsocket
關(guān)于SRWebSocket的API用法,可以看看樓主之前這篇文章:
iOS即時(shí)通訊,從入門到“放棄”?
二。 SRWebSocket的對(duì)外的業(yè)務(wù)流程:
首先貼一段SRWebSocket的API調(diào)用代碼:
//初始化socket并且連接
- (void)connectServer:(NSString *)server port:(NSString *)port
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@“ws://%@:%@”,server,port]]];
_socket = [[SRWebSocket alloc] initWithURLRequest:request];
_socket.delegate = self;
?。踎socket open];
}
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
{
}
- (void)webSocketDidOpen:(SRWebSocket *)webSocket
{
}
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
{
}
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
{
}
要簡(jiǎn)單使用起來(lái),總共就4行代碼,并且實(shí)現(xiàn)你需要的代理即可,整個(gè)業(yè)務(wù)邏輯非常簡(jiǎn)潔。
但是就這么幾個(gè)對(duì)外的方法,SRWebSocket.m里面用了2000行代碼來(lái)進(jìn)行封裝,那么它到底做了什么?我們接著往下看:
三。 SRWebSocket的初始化以及連接流程:
1首先我們初始化:
//初始化
- (void)_SR_commonInit;
{
//得到url schem小寫
NSString *scheme = _url.scheme.lowercaseString;
//如果不是這幾種,則斷言錯(cuò)誤
assert([scheme isEqualToString:@“ws”] || [scheme isEqualToString:@“http”] || [scheme isEqualToString:@“wss”] || [scheme isEqualToString:@“https”]);
_webSocketVersion = 13;
//初始化工作的隊(duì)列,串行
_workQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
//給隊(duì)列設(shè)置一個(gè)標(biāo)識(shí),標(biāo)識(shí)為指向自己的,上下文對(duì)象為這個(gè)隊(duì)列
dispatch_queue_set_specific(_workQueue, (__bridge void *)self, maybe_bridge(_workQueue), NULL);
//設(shè)置代理queue為主隊(duì)列
_delegateDispatchQueue = dispatch_get_main_queue();
//retain主隊(duì)列?
sr_dispatch_retain(_delegateDispatchQueue);
//讀Buffer
_readBuffer = [[NSMutableData alloc] init];
//輸出Buffer
_outputBuffer = [[NSMutableData alloc] init];
//當(dāng)前數(shù)據(jù)幀
_currentFrameData = [[NSMutableData alloc] init];
//消費(fèi)者數(shù)據(jù)幀的對(duì)象
_consumers = [[NSMutableArray alloc] init];
_consumerPool = [[SRIOConsumerPool alloc] init];
//注冊(cè)的runloop
_scheduledRunloops = [[NSMutableSet alloc] init];
。。.。省略了一部分代碼
}
會(huì)初始化一些屬性:
包括對(duì)schem進(jìn)行斷言,只支持ws/wss/http/https四種。
當(dāng)前socket狀態(tài),是正在連接,還是已連接、斷開等等。
初始化工作隊(duì)列,以及流回調(diào)線程等等。
非常好我支持^.^
(41) 50%
不好我反對(duì)
(41) 50%
下載地址
iOS系統(tǒng)SRWebSocket的源碼解析上下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問(wèn)題? 377
- 華為全新鴻蒙蓄勢(shì)待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋果手機(jī)系統(tǒng)iOS 17遭用戶質(zhì)疑 731
- iPhone12輻射超標(biāo)?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標(biāo)明年智能手機(jī)出貨7000萬(wàn)部;消息稱 MiOS 僅限國(guó)內(nèi),小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機(jī)身過(guò)熱 216
- Testin云測(cè)兼容和真機(jī)服務(wù)平臺(tái)中上線iPhone 15系列手機(jī) 208
- 利爾達(dá)推出搭載HooRiiOS的Matter模組 145
- 運(yùn)放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國(guó)產(chǎn)飛騰騰銳D2000芯片的開源BIOS固件版本 448