iOS 即时通信 中 Socket,WebSocket,Socket.IO 的区别

附上我的swfit项目, 项目里面有整个swift应用使用框架, 网络请求框架, DSBridge原生与H5交互的用法, 反射知识的使用, WCDB数据库的封装使用, WebRTC音视频直播demo, socket的使用, socket协议的封装使用等等知识点. 希望对大家有用.-->swfit完整项目2020持续更新完善

1. 背景

在 iOS 即时通信编程中提到的概念有Socket,WebSocket,Socket.IO,MQTTXMPP等其他协议,本文将主要介绍Socket,WebSocket,Socket.IO,其余的不做具体介绍,感兴趣的可以点击相关链接查看。

2. 概念

你真的能区分 Socket,WebSocket 和 SocketIO 吗?

2.1 Socket

Socket 英文原意是“插孔”,“插座”,通常被称作“套接字”,是操作系统进程通信机制的一种。不同于其他进程间通信,Socket 除了本机间进程通信,也可以用于不同机器间的进程通信。Socket 可以理解为两个程序通过一个双向的通信连接实现数据的交换,这个连接的两端都是 socket。

Socket 是网络编程的概念,不是网络协议,但可以理解为传输层协议和应用层协议之间的桥梁,通过几个简单的接口就可以实现进程间的通信。避免编程时直面TCP/UDP等协议。

image.png

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.

image

协议文档可以参考RFC 6455RFC 7936

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。

转自: https://www.jianshu.com/p/cc9814065f41

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

推荐阅读更多精彩内容