引言
随着聊天、社交、直播等软件的兴起,即时通信的应用也变得无处不在。
1. 背景
在 iOS 即时通信编程中提到的概念有Socket,WebSocket,Socket.IO,MQTT,XMPP等其他协议,本文将主要介绍Socket,WebSocket,Socket.IO,其余的不做具体介绍,感兴趣的可以点击相关链接查看。
2. 概念
你真的能区分 Socket,WebSocket 和 SocketIO 吗?
2.1 Socket
Socket 英文原意是“插孔”,“插座”,通常被称作“套接字”,是操作系统进程通信机制的一种。不同于其他进程间通信,Socket 除了本机间进程通信,也可以用于不同机器间的进程通信。Socket 可以理解为两个程序通过一个双向的通信连接实现数据的交换,这个连接的两端都是 socket。
Socket 是网络编程的概念,不是网络协议,但可以理解为传输层协议和应用层协议之间的桥梁,通过几个简单的接口就可以实现进程间的通信。避免编程时直面TCP/UDP等协议。
2.2 WebSocket
WebSocket 是一种在单个TCP连接上进行全双工通信的协议,注意 WebSocket 和 Socket 是完全不同的两个概念。引用原文(加翻译):
The WebSocket Protocol enables two-way communication between a client
running untrusted code in a controlled environment to a remote host
that has opted-in to communications from that code.
WebSocket 协议使在控制环境下运行不受信任代码的客户端和能够选择与那些代码通信的远程主机之间能够双向通信。
在WebSocket 之前,很多全双工通信的技术主要是轮询,即在特定的时间间隔由客户端对服务器发送HTTP请求,服务器给客户端返回最新结果。这样会有一定的弊端,引用原文(加翻译):
- The server is forced to use a number of different underlying TCP
connections for each client: one for sending information to the
client and a new one for each incoming message.
服务器被迫为每个客户端使用一些不同的底层TCP连接:一个用来向客户端发送消息,为每个到来的消息使用一个新的。- The wire protocol has a high overhead, with each client-to-server
message having an HTTP header.
通信协议具有很高的开销,因为每个客户端到服务器的消息有 HTTP 头。- The client-side script is forced to maintain a mapping from the
outgoing connections to the incoming connection to track replies.
客户端侧的脚本被迫维护输出连接到输入连接的映射来追踪响应。
WebSocket 是一种应用层协议,基于TCP 连接实现,提供了替代 HTTP 轮询的技术方案。WebSocket 建立连接时会用到 HTTP,数据传输和 HTTP 无关,引用原文:
The WebSocket Protocol is an independent TCP-based protocol. Its
only relationship to HTTP is that its handshake is interpreted by
HTTP servers as an Upgrade request.
2.3 Socket.IO
Socket.IO 是一个为浏览器(客户端)和服务器之间提供实时,双向和基于事件的通信软件库。引用原文:
Socket.IO is a library that enables real-time, bidirectional and event-based communication between the browser and the server.
Socket.IO 是把数据传输抽离成 Engine.IO,内部对轮询(Polling)和 WebSocket 等进行了封装,抹平一些细节和平台兼容的问题,提供统一的 API。
polling url示例
https://test.socketio.com/socket.io/?transport=polling&b64=1&sid=9Sv6h5s5O57z82RLAAxy
websocket url示例
wss://test.socketio.com/socket.io/?transport=websocket&sid=9uePu-f-RQ0FJ_x9AAxP
注意 Socket.IO 不是 WebSocket 的实现,只是在必要时使用 WebSocket 传输数据,并在此基础上会加一些 MetaData。这就是为什么 WebSocket 的客户端/服务器 无法和 Socket.IO 的服务器/客户端进行通信。引用原文:
Socket.IO is NOT a WebSocket implementation. Although Socket.IO indeed uses WebSocket as a transport when possible, it adds some metadata to each packet: the packet type, the namespace and the ack id when a message acknowledgement is needed. That is why a WebSocket client will not be able to successfully connect to a Socket.IO server, and a Socket.IO client will not be able to connect to a WebSocket server either.
3. iOS 第三方库整理
3.1 基于Socket
CocoaAsyncSocket,Objective-C 语言,基于 Socket 实现,分为 TCP(GCDAsyncSocket) 和 UDP(GCDAsyncSocket) 版本,为 iOS 和 Mac 提供简单和强有力的异步 Socket 库。
3.2 基于WebSocket
Starscream,Swift 语言的 WebSocket库,是 jetfire 的 Swift 版本。
jetfire,Objective-C 语言的 WebSocket 库,是 Starscream 的 Objective-C 版本。
SocketRocket,Facebook开源的 Objective-C 语言的 WebSocket 库。
PocketSocket,Objective-C 语言的 WebSocket 库,和 SocketRocket 接口非常相似。
3.3 基于Socket.IO
socket.io-client-swift,官方版本,Swift 语言,内部依赖了 StarScream,在 WebSocket 的基础上加了许多协议规范。目前最新版本为2.0.3。
SIOSocket,Objective-C语言,支持Socket.IO 1.0,实现原理是用 UIWebView 加载 JS,通过 JS 实现 Socket.IO,用 Objective-C 封装 JS 接口。
socket.IO-objc,Objective-C 语言,支持 socket.io v0.7.2 - 0.9.x for iOS and OS X。
socket.IO-objc,Objective-C 语言,支持 socket.io v0.9.x - 1.0 for iOS and OS X。
注:以上只有 Swift 语言的 socket.io-client-swift 还在维护,其余的均两年以上未更新
本文内容为原创, 转载请注明出处~
部分图片来源于网络,如有侵权,请联系我删除~
如有错误,欢迎指正~