美文网首页
使用 socketIO实现长连接

使用 socketIO实现长连接

作者: 来敲代码 | 来源:发表于2021-03-18 14:16 被阅读0次

    实现长连接有很多

    CocoaAsyncSocket:https://github.com/robbiehanson/CocoaAsyncSocket
    Facebook的SocketRocket https://github.com/facebook/SocketRocket
    socket.io https://github.com/socketio/socket.io-client-swift
    今天讲解使用过的 socket.io-client-swift 作为记录 也为小伙伴提供参考

    socket.io-client-swift是一个swift实现的Socket.IO框架
    我们如果使用cocopods的话

    pod ‘Socket.IO-Client-Swift’
    
    

    安装好之后,实现长连接就简单了:

    1)首先在你的viewController中引入这个第三方,

    @import SocketIO;
    /**是@而不是#import
    
    如果做好桥接 也可以
    #import <SocketIO/SocketIO-Swift.h>
    
    总之引入正确就行,不行百度解决  
    */
    

    2)可对socket进行二次封装代理方法,这里就只讲使用

    
    // 这里字典包含长链接所需url 和后台同事约定好字段就行
       NSURL* url = [[NSURL alloc] initWithString:[dic valueForKey:@"chatserver"]];
    
    // NSURL *url = [NSURL URLWithString:@"https://socketio-chat.now.sh/"]; 
    
    

    3) 一种初始化方法

    
    //使用给定的url初始化一个socketIOClient,后面的config是对这个socket的一些配置,比如log设置为YES,控制台会打印连接时的日志等
    
    SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
    
     [socket connect];
    

    4) 另一种种初始化方法

    
       NSURL* url = [[NSURL alloc] initWithString:[dic valueForKey:@"chatserver"]];
    
       SocketManager*socketManager = [[SocketManager alloc] initWithSocketURL:url config:@{@"log": @NO, @"compress": @YES}];
       SocketIOClient *socket  = socketManager.defaultSocket;
    
       [socket connect];
    

    4) 具体监听方法

    // 链接后 与后台约定参数
       NSArray *cur = @[@{
                          @"uid":[Config getOwnID] ?  [Config getOwnID] : model.uid,
                          @"token":[Config getOwnID] ? [Config getOwnToken] : model.token,
                          @"roomnum":[dic valueForKey:@"uid"],
                          @"stream":[dic valueForKey:@"stream"],
                          @"gameId":[dic valueForKey:@"gameId"]
    
                          }];
    
        //监听是否连接上服务器,正确连接走后面的回调
        [socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
            NSLog(@"socket connected");
           [socket emit:@"conn" with:cur];
        }];
       [socket on:@"disconnect" callback:^(NSArray* data, SocketAckEmitter* ack) {
           NSLog(@"socket.io disconnect---%@",data);
       }];
       [socket on:@"error" callback:^(NSArray* data, SocketAckEmitter* ack) {
           NSLog(@"socket.io error -- %@",data);
       }];
       [socket on:@"conn" callback:^(NSArray* data, SocketAckEmitter* ack) {
           NSLog(@"进入房间");
          
       }];
    
    // broadcastingListen 这个与后台约定字段 
       [socket on:@"broadcastingListen" callback:^(NSArray* data, SocketAckEmitter* ack) {
           
           for (NSString *path in data[0]) {
               NSDictionary *jsonArray = [path JSONValue];
               NSDictionary *msg = [[jsonArray valueForKey:@"msg"] firstObject];
               NSString *retcode = [NSString stringWithFormat:@"%@",[jsonArray valueForKey:@"retcode"]];
               NSString *method = [msg valueForKey:@"_method_"];
               if ([retcode isEqual:@"409002"]) {
                   [MBProgressHUD showError:@"你已被禁言"];
                   return;
               }
             if ([method isEqual:@"SendMsg"]) {
                
                // 这里代理封装 传递给使用的控制器
               [weakself getmessage:msg andMethod:method];
    
               }else if ([method isEqual:@"leaveAction"]) {
                
              // 用户离开
    
               }
    
           }
       }];
        
    
    

    5)真正开发中,需要给服务端传递规定好的关键字,服务端才会正确的返回你想获取的数据,这个时候就要用到emmit()方法

      [socket emit:@"conn" with:cur];
    

    6)如果想停止本次长连接,也很简单,调用disconnect()方法即可。

    [self.socket disconnect];
    

    7)官网示例

    NSURL *url = [NSURL URLWithString:@"https://socketio-chat.now.sh/"];
    
    SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
    
        [socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
            NSLog(@"socket connected");
        //  [socket emit:@"conn" with:cur];
        }];
        //监听new message,这是socketIO官网提供的一个测试用例,大家都可以试试。如果成功连接,会收到data内容。
        [socket on:@"new message" callback:^(NSArray* data, SocketAckEmitter* ack) {
            NSLog(@"response is %@",data);
        }];
        [socket connect];
    

    相关文章

      网友评论

          本文标题:使用 socketIO实现长连接

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