iOS Socket.io二三事

前言

Socket.io 是一个基于WebSocket协议的Socket组件。通过这个组件我们可以很容易实现基于Socket连接的功能,例如实时聊天,弹幕等等。

同时Socket.io也支持多平台,在iOS上为Swift编写。

实例

在Socket.io中分别有两个方法,提交和监听。
这两个方法在socket通信中对应的就是一来一回的数据传输。监听来自服务器的消息,以及提交本地客户端的操作到服务器。

  • 提交 func emit(_ event: String, _ items: SocketData...)
  • 监听 func on(_ event: String, callback: @escaping NormalCallback) -> UUID

通过监听特定事件来获取服务器的消息,以及提交特定事件来提交数据至服务器。值得一提的是提交数据支持二进制数据dataString甚至是字典,支持的范围十分广泛。

一些值得注意的坑

  • 在Objective-C和Swift混编的时候,初始化需要的config参数是一个字典,字典Key无法自动补全,提供的可配置的Key在SocketIOClientOption枚举中。
 /// Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity.
    /// If using Swift it's recommended to use `init(socketURL: NSURL, options: Set<SocketIOClientOption>)`
    ///
    /// - parameter socketURL: The url of the socket.io server.
    /// - parameter config: The config for this socket.
    public convenience init(socketURL: NSURL, config: NSDictionary?) {
        self.init(socketURL: socketURL as URL, config: config?.toSocketConfiguration() ?? [])
    }
  //例如:
   SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"compress": @YES}];
  • 假如服务器设置了namespace,在初始化参数中为nsp,并且value必须以/开头。如:@"nsp":@"/chatroom"

  • 在与服务器的授权验证中,如果使用了明文的token,即将授权token当作参数提交至服务器,应该设置connectParams

  • 如果授权验证在Cookies中或者Header中,可以设置相应的extraHeaderscookies

  • 服务器URL不需要带上Socket.io后缀,在组件内部会自动补全。直接设置为服务器地址即可。

  • 设置监听事件必须在调用connect方法之前监听完毕,然后才能调用connect方法。

我遇到的坑

一开始初始化并连接服务器,发现始终无法连接成功,初步认定有可能是授权不成功,遂与服务器调试,发现服务器在关闭授权的方法之后终于能够连接成功,但并无法收到消息。进一步调试发现并未进入服务器设置的Namespace中,最终确定Namespace的设置有问题,经过排查发现Namespace参数拼写并无问题。最后只能阅读源码,发现iOS平台上的组件连接的时候并未使用nsp参数,直接导致无法进入指定的Namespace,这也直接证明一开始的问题所在,由于服务器的授权验证放置在指定的Namespace中,连接一开始,并未进入指定的Namespace,直接导致授权无法通过,无法连接成功。

解决的办法就是只能改写源码:

open func engineDidOpen(reason: String) {
      //插入
        if reason == "Connect" {
            joinNamespace(nsp)
        }
    //
        DefaultSocketLogger.Logger.log(reason, type: SocketIOClient.logType)
    }

虽然改动并不大,但是从头到尾阅读源码并解析着实费了一番功夫。

一些反思

第一,很多时候我们要用到别人造的轮子,在以往我会关注作者代码的质量,以及组件的完善程度,和自身项目是否合适,这里的合适包括多个方面的考量,组件可维护性,对项目的入侵性,耦合性,等等。但是从未考虑过一个点就是这个轮子是不是存在先天的缺陷。先入为主的思想影响着我自然而然的认为既然作为官方组件肯定是没有问题的经过妥善测试的。
这让我在以后对于组件的挑选更需要慎重认真了解,以及警惕性。

第二,解决问题的过程中多次僵持,一度想要放弃换用其他基于同样通讯协议下的组件。 很多时候情绪会影响我们写代码和调试,遇到问题应该冷静,重新审视逻辑流程等等。切不可被情绪影响慌了手脚。 暂时性的放下手上的工作,休息几分钟深呼吸等等往往有奇效。

第三,很多时候问题往往藏在最不容易发觉的地方,特别是此次官方的源代码出了问题。不应该抱着侥幸的想法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,983评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,354评论 3 403
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,216评论 0 367
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,061评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,073评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,541评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,906评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,881评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,428评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,460评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,578评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,176评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,913评论 3 339
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,348评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,490评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,142评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,650评论 2 366

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,750评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,447评论 25 707
  • 有人说这世上最难的事就是真正去爱一个人,其实真爱并不难,不用惊天动地,就在稀松平常的生活中。 他若真的爱你 关于“...
    群姐阅读 477评论 0 0
  • 最近迷上了黑鸟SR-71高空侦察机,想了想如果有人让我介绍为什么会迷上它,该怎么介绍才能让别人也喜欢它呢? 首先,...
    不捞鱼的猫阅读 628评论 0 0