使用 socketIO实现长连接

2021-03-18  本文已影响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];
上一篇下一篇

猜你喜欢

热点阅读