美文网首页iOS 开发 学习
webSocket开源框架:SocketRocket 简单的使用

webSocket开源框架:SocketRocket 简单的使用

作者: 清蘂翅膀的技术 | 来源:发表于2017-05-16 11:27 被阅读306次

    需要用到webSocket,所以搜集了一下使用方法,(手动包 导入要把#import<> 改成#import“”)

    git下载地址:square/SocketRocket

    gitHUB 上没有看懂,就要 cocoaPod 导入了 socketRocket

    导入这个包然后添加所需要的框架

    导入头文件

    #import"SRWebSocket.h"

    代码的实现

    #import

    #import"SocketRocket.h"

    @interfaceViewController : UIViewController

    @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消息的时候,如果非要想在里面加入一些参数,这个参数不能太大,太大的话,会提示发送失败

    详细需要更多了解请联系本人

    Demo示例(加入聊天室):

    #pragma mark - SRWebSocketDelegate

    - (void)Reconnect {

    //webSocket

    self.webSocket.delegate = nil;

    [self.webSocket close];

    self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@:7272",webChatURL]]]];

    self.webSocket.delegate = self;

    MYLog(@"Opening Connection...");

    [self.webSocket open];

    }

    - (void)webSocketDidOpen:(SRWebSocket *)webSocket;{

    MYLog(@"Websocket Connected");

    NSError *error;

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:@{@"type":@"login",@"client_name":@"QL",@"room_id":@"dududache"} options:NSJSONWritingPrettyPrinted error:&error];

    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    [webSocket sendString:jsonString error:&error];

    }

    - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;{

    MYLog(@":( Websocket Failed With Error %@", error);

    webSocket = nil;

    }

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

    MYLog(@"Received \"%@\"", message);

    }

    - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;{

    MYLog(@"WebSocket closed");

    webSocket = nil;

    }

    相关文章

      网友评论

      • LMGod:- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(nullable NSArray<NSString *> *)protocols
        我想问一下这个protocols是干什么用的

      本文标题:webSocket开源框架:SocketRocket 简单的使用

      本文链接:https://www.haomeiwen.com/subject/jzqlxxtx.html