webSocket開源框架:SocketRocket 簡單的使用


需要用到webSocket,所以搜集了一下使用方法,

git下載地址:square/SocketRocket

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM