SocketRocket的簡單使用

關(guān)于websocket

我們都知道socket是套接字,描述ip地址和端口混聊,它本身并不是協(xié)議弹谁,而是一個(gè)調(diào)用接口,為了大家直接使用更底層的協(xié)議(TCP或UDP)句喜,是對TCP/IP 或 UDP/IP的封裝预愤。socket處于網(wǎng)絡(luò)層中的第五層,是一個(gè)抽象層咳胃。websocket是一個(gè)協(xié)議植康,是基于http協(xié)議的,是建立在TCP連接之上的展懈,是應(yīng)用層上的一個(gè)應(yīng)用層協(xié)議销睁,和socket不是一個(gè)概念供璧。

websocket的特點(diǎn)

websocket可以傳輸文本和二進(jìn)制。
websocket的協(xié)議頭是ws開頭的冻记,并不是http睡毒。

框架

在iOS 平臺上,我們知道socket的開源框架有 CocoaAsyncSocket冗栗, 而websocket的框架有Facebook的 SocketRocket演顾, 以及socket.io-client-swift。

SocketRocket的使用

使用cocoapods集成

   pod 'SocketRocket', '~> 0.5.1'

創(chuàng)建方法

self.wSocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:@“ws://192.168.2.21:8080”]];
self.wSocket.delegate = self;
[self.wSocket open];

這里要特別注意格式

ws://ip地址:端口號

如果服務(wù)器使用的框架是socket.io贞瞒,客戶端和服務(wù)器進(jìn)行連接偶房,客戶端實(shí)現(xiàn)了SRWebSocketDelegate的代理方法后,并沒有在打開成功的方法中實(shí)現(xiàn)回調(diào)军浆,而是直接實(shí)現(xiàn)了關(guān)閉的(didCloseWithCode)回調(diào),打印的結(jié)果如下:

code:1001, reason:Stream end encountered, wasClean:0

那么 這里的url就應(yīng)該再進(jìn)行一下參數(shù)拼接了

@“ws://192.168.2.21:8080”   改成
@“ws://192.168.2.21:8080/socket.io/?EIO=4&transport=websocket”

遵守SRWebSocketDelegate協(xié)議并實(shí)現(xiàn)代理方法
接收消息的代理方法是必須實(shí)現(xiàn)的挡闰,要不然就crash了

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;

下面的代理方法展示的是乒融,當(dāng)前websocket的連接狀態(tài),open摄悯,fail赞季,close,receivePong

// 打開websocket成功的回調(diào)
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
// 發(fā)生錯(cuò)誤的回調(diào)
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
// websocket關(guān)閉的回調(diào)
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
//  來著服務(wù)器pong消息
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;

關(guān)于 didReceivePong方法的理解
使用webSocket時(shí)奢驯,最好建立一個(gè)心跳包申钩,用于每隔一段時(shí)間(5s也好十幾秒也好)通知一次服務(wù)端,告訴服務(wù)器瘪阁,客戶端還活著撒遣,這就是一個(gè)ping消息。然后呢管跺,服務(wù)器返回給客戶端一個(gè)pong消息义黎,這個(gè)pong消息呢,就在 didReceivePong 這個(gè)代理方法中去接收豁跑。

客戶端發(fā)送消息的方法:

- (void)send:(id)data;

在發(fā)送信息的時(shí)候廉涕,要和服務(wù)器進(jìn)行商量,格式是什么樣的艇拍,如果格式不對的話狐蜕,每發(fā)送一次,websocket都會關(guān)閉一次卸夕,這就很蛋疼了层释。
發(fā)送消息的時(shí)候,最好是創(chuàng)建一個(gè)模型 -> 轉(zhuǎn)字典-> 轉(zhuǎn)data-> 轉(zhuǎn)成字符串娇哆。最后發(fā)送給服務(wù)器的就是這個(gè)字符串了湃累。

    XQMessage* message = [[XQMessage alloc] initWithMessage:textField.text userId: userTextField.text];
    NSError* error;
    NSData* data = [NSJSONSerialization dataWithJSONObject:message.mj_keyValues options:0 error:&error];    
    [self.wSocket send:[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]];

在接收到消息didReceiveMessage的方法中勃救,再把服務(wù)器傳過來的數(shù)據(jù),轉(zhuǎn)換成模型治力,方便使用蒙秒。


學(xué)會了簡單的使用socketRocket之后呢,最好封裝一個(gè)工具類宵统,來進(jìn)行統(tǒng)一的管理晕讲,外界方便使用調(diào)用。需要注意的事马澈,在封裝的過程中瓢省,要定義一個(gè)屬性state,表示websocket的連接狀態(tài)痊班,是關(guān)閉勤婚?連接中?已連接涤伐?連接錯(cuò)誤疟暖?系統(tǒng)關(guān)閉扬舒?用戶關(guān)閉?接收到信息等。根據(jù)實(shí)際的需求去做一些相應(yīng)的處理劣光。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脏答,一起剝皮案震驚了整個(gè)濱河市尖淘,隨后出現(xiàn)的幾起案子萍摊,更是在濱河造成了極大的恐慌,老刑警劉巖山害,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纠俭,死亡現(xiàn)場離奇詭異,居然都是意外死亡粗恢,警方通過查閱死者的電腦和手機(jī)柑晒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眷射,“玉大人匙赞,你說我怎么就攤上這事⊙铮” “怎么了涌庭?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欧宜。 經(jīng)常有香客問我坐榆,道長,這世上最難降的妖魔是什么冗茸? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任席镀,我火速辦了婚禮匹中,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豪诲。我一直安慰自己顶捷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布屎篱。 她就那樣靜靜地躺著服赎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪交播。 梳的紋絲不亂的頭發(fā)上重虑,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音秦士,去河邊找鬼缺厉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛隧土,可吹牛的內(nèi)容都是我干的芽死。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼次洼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遇骑?” 一聲冷哼從身側(cè)響起卖毁,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎落萎,沒想到半個(gè)月后亥啦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡练链,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年翔脱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒鼓。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡届吁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绿鸣,到底是詐尸還是另有隱情疚沐,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布潮模,位于F島的核電站亮蛔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏擎厢。R本人自食惡果不足惜究流,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一辣吃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芬探,春花似錦神得、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炎疆,卻和暖如春卡骂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背形入。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工全跨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亿遂。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓浓若,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛇数。 傳聞我的和親對象是個(gè)殘疾皇子挪钓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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