引言
隨著聊天、社交、直播等軟件的興起,即時通信的應用也變得無處不在。
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 還在維護,其余的均兩年以上未更新
本文內容為原創, 轉載請注明出處~
部分圖片來源于網絡,如有侵權,請聯系我刪除~
如有錯誤,歡迎指正~