需要用到webSocket,所以搜集了一下使用方法,
gitHUB 上沒有看懂,就要 cocoaPod 導入了 socketRocket
導入這個包然后添加所需要的框架
導入頭文件
#import "SRWebSocket.h"
代碼的實現
#import <UIKit/UIKit.h> #import "SocketRocket.h" @interface ViewController : UIViewController<SRWebSocketDelegate> @property (nonatomic,strong)SRWebSocket *webSocket; @end
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *showTxt; @end @implementation ViewController - (void)viewWillAppear:(BOOL)animated{ [self Reconnect]; } - (void)viewDidDisappear:(BOOL)animated{ // Close WebSocket self.webSocket.delegate = nil; [self.webSocket close]; self.webSocket = nil; } - (void)viewDidLoad { [super viewDidLoad]; } //初始化 - (void)Reconnect{ self.webSocket.delegate = nil; [self.webSocket close]; self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://echo.websocket.org"]]]; self.webSocket.delegate = self; self.title = @"Opening Connection..."; [self.webSocket open]; } //成功連接 - (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 { NSLog(@"Received \"%@\"", message); self.showTxt.text = message; } // 長連接關閉 - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean { NSLog(@"WebSocket closed"); self.title = @"Connection Closed! (see logs)"; self.webSocket = nil; } //該函數是接收服務器發送的pong消息 - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload { NSString *reply = [[NSString alloc] initWithData:pongPayload encoding:NSUTF8StringEncoding]; NSLog(@"%@",reply); } - (IBAction)sendAction:(id)sender { [self.view endEditing:YES]; // WebSocket if (self.webSocket) { [self.webSocket send:@"test success"]; } }
有關這個方法需要說一下
-(void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload{ socketPong = socketPong + 1; }
其中最后一個是接受pong消息的,在這里就要提一下心跳包,一般情況下建立長連接都會建立一個心跳包,用於每隔一段時間通知一次服務端,客戶端還是在線,這個心跳包其實就是一個ping消息,我的理解就是建立一個定時器,每隔十秒或者十五秒向服務端發送一個ping消息,這個消息可是是空的,例如
NSData * data = [[NSData alloc]init];
[_webSocket sendPing:data];
發送過去消息以后,服務器會返回一個pong消息,這個消息是解讀不了的,但是每次返回時就會調用-(void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload這個函數,如果要用到話,可以像我做的那樣,直接在該函數里面統計一下收到的次數,跟發送的次數比較,如果每次發送之前,自己發送的ping消息的個數,跟收到pong消息的個數相同,那就代表一直在連接狀態,但是服務器發送pong消息時候是自動發送的,服務器是看不到客戶端發送的ping消息的,同理,服務端也一樣,只要服務端建立有心跳連接,那么服務端也是一直在發送ping消息,客戶端一直在回復pong消息,這兩個消息是處理不了的,沒辦法解讀這個歌消息體里面的內容。還有一點就是在發送ping消息的時候,如果非要想在里面加入一些參數,這個參數不能太大,太大的話,會提示發送失敗
//server的例子參考
//http://haoningabc.iteye.com/blog/2124605