Socket.io 是一个基于WebSocket协议的Socket组件。经过这个组件咱们能够很容易实现基于Socket链接的功能,例如实时聊天,弹幕等等。git
同时Socket.io也支持多平台,在iOS上为Swift编写。github
在Socket.io中分别有两个方法,提交和监听。 这两个方法在socket通讯中对应的就是一来一回的数据传输。监听来自服务器的消息,以及提交本地客户端的操做到服务器。swift
func emit(_ event: String, _ items: SocketData...)
func on(_ event: String, callback: @escaping NormalCallback) -> UUID
经过监听特定事件来获取服务器的消息,以及提交特定事件来提交数据至服务器。值得一提的是提交数据支持二进制数据data
、String
甚至是字典,支持的范围十分普遍。api
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
。cookie
若是受权验证在Cookies中或者Header中,能够设置相应的extraHeaders
和cookies
。socket
服务器URL不须要带上Socket.io后缀,在组件内部会自动补全。直接设置为服务器地址便可。测试
设置监听事件必须在调用connect
方法以前监听完毕,而后才能调用connect
方法。this
一开始初始化并链接服务器,发现始终没法链接成功,初步认定有多是受权不成功,遂与服务器调试,发现服务器在关闭受权的方法以后终于可以链接成功,但并没有法收到消息。进一步调试发现并未进入服务器设置的Namespace中,最终肯定Namespace的设置有问题,通过排查发现Namespace参数拼写并没有问题。最后只能阅读源码,发现iOS平台上的组件链接的时候并未使用nsp参数,直接致使没法进入指定的Namespace,这也直接证实一开始的问题所在,因为服务器的受权验证放置在指定的Namespace中,链接一开始,并未进入指定的Namespace,直接致使受权没法经过,没法链接成功。url
解决的办法就是只能改写源码:
open func engineDidOpen(reason: String) {
//插入
if reason == "Connect" {
joinNamespace(nsp)
}
//
DefaultSocketLogger.Logger.log(reason, type: SocketIOClient.logType)
}
复制代码
虽然改动并不大,可是从头至尾阅读源码并解析着实费了一番功夫。
第一,不少时候咱们要用到别人造的轮子,在以往我会关注做者代码的质量,以及组件的完善程度,和自身项目是否合适,这里的合适包括多个方面的考量,组件可维护性,对项目的入侵性,耦合性,等等。可是从未考虑过一个点就是这个轮子是否是存在先天的缺陷。先入为主的思想影响着我天然而然的认为既然做为官方组件确定是没有问题的通过妥善测试的。 这让我在之后对于组件的挑选更须要慎重认真了解,以及警戒性。
第二,解决问题的过程当中屡次僵持,一度想要放弃换用其余基于一样通信协议下的组件。 不少时候情绪会影响咱们写代码和调试,遇到问题应该冷静,从新审视逻辑流程等等。切不可被情绪影响慌了手脚。 暂时性的放下手上的工做,休息几分钟深呼吸等等每每有奇效。
第三,不少时候问题每每藏在最不容易发觉的地方,特别是这次官方的源代码出了问题。不该该抱着侥幸的想法。