iOS開發項目- 基於WebSocket的聊天通訊(1)_IOS

來源:互聯網
上載者:User

公司項目需要開發一個類似QQ、微信的即時IM聊天功能,做到即時監控訊息,需要用的技術是websocket。

概述WebSocket:

1.1 為什麼我們需要WebSocket這樣的即時的通訊協定?

WebSocket是web通訊方式的一種,像我們熟知的HTTP協議也是web通訊方式的一種。但是我們知道HTTP協議是一種無狀態的協議,其服務端本身不具備識別用戶端的能力,必須藉助外部的一些資訊比如說session和cookie,才能與特定的用戶端保持通訊。也就是說我們所發送的每一個HTTP的請求都會帶上要求標頭中一些相應的資訊還有cookie,這明顯會增加我們傳輸的資訊的體量從而帶來一定的網路延遲,對於一些對通訊的即時性要求比較高的應用來說就是不可忍受的了,比如說聊天程式或者是運行在瀏覽器中的即時小遊戲。最鬱悶的卻還是這些頭資訊和cookie往往對於伺服器響應用戶端的請求來說是多餘的,也就是說雖然我每個請求都帶了這些資訊,但是伺服器與用戶端的互動過程中可能根本用不上這些資訊。

為了改善HTTP請求的這種網路延遲的情況,也出現了一些適應不同需求的其他的[web通訊]方式,比如說:輪詢,長輪詢(long-polling),資料流,EventSouce等等,WebSocket便是其中一種。

實際上大多數基於網際網路(或者區域網路)的網路連結通常都包含長串連和基於TCP通訊端的雙向訊息交換。但是TCP協議是屬於最底層的網路通訊協定了,讓一些不能信任的用戶端指令碼去訪問底層的TCP通訊端顯然是不太安全的,因此WebSocket實現了一種較為安全的方案,它允許用戶端指令碼在用戶端和支援WebSocket協議的伺服器之間建立雙向的通訊端串連。從而使即時通訊的某些網路操作變得簡單。

1.2 WebSocket是如何工作的?

我們知道了WebSocket的主要作用是,允許伺服器端與用戶端進行全雙工系統(full-duplex)的即時通訊。這裡有個例子特別好:HTTP協議像發電子郵件,發出後必須等待對方回信;WebSocket則是像打電話,伺服器端和用戶端可以同時向對方發送資料,它們之間存著一條持續開啟的資料通道。

1.Pod匯入SocketRocket

platform :ios,'7.0'target '白__Socket--Demo1' do   pod 'SocketRocket', '~> 0.5.1'end

2.匯入對象SRWebSocket

#import "ViewController.h"#import "SRWebSocket.h"@interface ViewController ()<SRWebSocketDelegate>@property(nonatomic,strong) SRWebSocket *webSocket;@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];}//初始化- (void)Reconnect{  NSLog(@"1221---open");  self.webSocket.delegate = nil;  [self.webSocket close];  self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://192.168.5.120:4141"]]];  self.webSocket.delegate = self;  self.title = @"Opening Connection...";  [self.webSocket open];}- (void)viewWillAppear:(BOOL)animated{  [self Reconnect];}- (void)viewDidDisappear:(BOOL)animated{  // Close WebSocket  self.webSocket.delegate = nil;  [self.webSocket close];  self.webSocket = nil; }

3.SRWebSocketDelegate

//串連成功//代理方法實現#pragma mark - SRWebSocketDelegate- (void)webSocketDidOpen:(SRWebSocket *)webSocket{  NSLog(@"Websocket Connected");  self.title = @"Connected!"; }//串連失敗- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{  NSLog(@":( Websocket Failed With Error %@", error);  self.title = @"Connection Failed! (see logs)";  self.webSocket = nil; }//接收到新訊息的處理- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{//  NSString *str1 = self.replyContent.text;//  NSString *str2 = [str1 stringByAppendingFormat:@"%@\n",message];//  self.replyContent.text = str2;  NSLog(@"%@--askl",message); }//串連關閉- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{  NSLog(@"Closed Reason:%@",reason);  self.title = @"Connection Closed! (see logs)";  self.webSocket = nil; }//該函數是接收伺服器發送的pong訊息,其中最後一個是接受pong訊息的,在這裡就要提一下心跳包,一般情況下建立長串連都會建立一個心跳包,用於每隔一段時間通知一次服務端,用戶端還是線上,這個心跳包其實就是一個ping訊息,我的理解就是建立一個定時器,每隔十秒或者十五秒向服務端發送一個ping訊息,這個訊息可是是空的- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload{  NSString *reply = [[NSString alloc] initWithData:pongPayload encoding:NSUTF8StringEncoding];  NSLog(@"%@",reply); }#pragma mark - SendButton Response- (IBAction)sendAction:(id)sender {  [self.view endEditing:YES];  // WebSocket  if (self.webSocket) {    [self.webSocket send:@"您好 !"];  }}

實現效果:

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.